mssql表变量和临时表

 - by Hector

表变量

定义
一种特殊的数据类型,用于存储结果集以供后续处理。该数据类型主要用于临时存储一组行,这些行将作为表值函数的结果集返回。
尽可能使用表变量而不使用临时表。
表变量有以下特点
  • 1.表变量的行为类似于局部变量,有明确定义的作用域。该作用域为声明该变量的函数、存储过程或批处理。
    在其作用域内,表变量可像常规表那样使用。该变量可应用于 SELECT、INSERT、UPDATE 和 DELETE 语句中用到表或表的表达式的地方。但是,表不能用在下列语句中:
    INSERT INTO table_variable EXEC 存储过程。
    SELECT select_list INTO table_variable 语句。
  • 2.在定义表变量的函数、存储过程或批处理结束时,自动清除表变量。
  • 3·表类型声明中的 CHECK 约束、DEFAULT 值和计算列不能调用用户定义函数。
  • 4·在存储过程中使用表变量与使用临时表相比,减少了存储过程的重新编译量。
  • 5·涉及表变量的事务只在表变量更新期间存在。这样就减少了表变量对锁定和记录资源的需求。
  • 6·不支持在表变量之间进行赋值操作。
    declare @t1 table(t1 int)
    declare @t2 table(t2 int)
    set @t1=@t2 –错误
  • 7·另外,由于表变量作用域有限,并且不是持久数据库的一部分,因而不受事务回滚的影响。

MS SQL 中的”默认值”详解

 - by Hector

— 说明: T-SQL 中没有”默认值对象”和”默认值约束”的区别, 而是统称为”默认值”. 这里仅为了讨论方便.
— 所谓”默认值对象”, 指作为 CREATE DEFAULT 语句的一部分创建的默认值定义;
— 所谓”默认值约束”, 指作为 CREATE TABLE 或 ALTER TABLE 语句的一部分创建的默认值定义.
— 注意: 后续版本的 Microsoft SQL Server 将删除由 CREATE DEFAULT 语句创建的默认值定义, 应使用
— 通过 ALTER TABLE 或 CREATE TABLE 的 DEFAULT 关键字创建的默认定义.

— 1. 创建”默认值对象”

delphi程序文件后缀名

 - by Hector

扩展名 英文解释 文件内容HWez
BPG Borland Project Group 工程项目包, 多个工程文件DPR的集合ja
DPR Delphi Project 应用系统的工程文件&-kyJ
PAS Pascal File 单元文件,存放Pascal源代码%N[4+
DFM Delphi form File 窗体界面文件, 同PAS文件同名,而且一一对应, 定义了窗体属性和构件的属性Bt”rl5
DOF Delphi Option File 选项文件, 包括编译信息等, 是一个文本文件件,可以看看%Xu[r2
CFG Project Configuration File 编译器可读的配置文件1D1Y
DSK Desktop Setting File 保存工程文件的桌面摆布情况, 下次打开时可以恢复上次保存的桌面状态S?K
DSM 集成开发环境IDE的临时保存文件, 有时IDE总出错, 可以将这个文件删掉, 系统会重新生成l)dO
RES Resource File Windows 的资源文件, 可以定义光标, 位图, 图标资源, 可以使用ImageEditor编辑T
DCU Delphi Compile Unit 编译后的单元文件, 程序连接时需要它,{
DLL Dymanic-link libraries Windows 动态链接库\~
EXE Executable File 编译生成的可执行文件:bm!A@
DPK Delphi Packge Source 包文件的源代码K(i
BPL Borland Package library 包, 是一种特殊的DLL文件, 用于代码重用和减少可执行文件的长度

SQL server自定义数据类型

 - by Hector

用户定义的数据类型要放在使用他的数据库里才有效,由于存储过程中建立的临时表会建立在tempdb里面,所以要先在tempdb里执行,再在mastrer里执行
查看用户定义的数据类型:

sql2005: select * from sys.types where is_user_defined=1
sql2000:select * from systypes where xtype<>xusertype

自定义数据类型
建立在SQL server系统数据类型基础上的,需要指定该类型的名称,建立在其上的系统数据类型及是否充许为空。
方法:利用系统存储过程:sp_addtype
语法:sp_addtype type, [ system_data_type ] [ ,’nulltype’ ]

事务计数器和事务嵌套

 - by Hector
1.计数方法
事务计数器从0开始,没嵌套一个事务,事务计数器+1,COMMIT一个事务计数器-1.
注意:事务保存点属于事务内部,不会对事务计数器产生影响。

下面的示例演示嵌套的 BEGIN 和 COMMIT 语句对 @@TRANCOUNT 变量产生的效果。
[code lang="sql"]
PRINT @@TRANCOUNT
-- The BEGIN TRAN statement will increment the
-- transaction count by 1.
BEGIN TRAN
PRINT @@TRANCOUNT
BEGIN TRAN
PRINT @@TRANCOUNT
-- The COMMIT statement will decrement the transaction count by 1.
COMMIT
PRINT @@TRANCOUNT
COMMIT
PRINT @@TRANCOUNT
--Results
--0
--1
--2
--1
--0
[/code]

2. 事务回滚对事务计数器的影响
当子事务ROLLBACK之后,会直接清零TRANCOUNT,下面的示例演示嵌套的 BEGIN TRAN 和 ROLLBACK 语句对 @@TRANCOUNT 变量产生的效果。
[code lang="sql"]
PRINT @@TRANCOUNT
-- The BEGIN TRAN statement will increment the
-- transaction count by 1.
BEGIN TRAN
PRINT @@TRANCOUNT
BEGIN TRAN
PRINT @@TRANCOUNT
-- The ROLLBACK statement will clear the @@TRANCOUNT variable
-- to 0 because all active transactions will be rolled back.
ROLLBACK
PRINT @@TRANCOUNT
--Results
--0
--1
--2
--0[/code]
3.使用保存点确保事务嵌套时能正确回滚
[code lang="sql"]
begin transaction trn_example

update tableName set fieldName = @value
save transaction stk_savePoint
update tableName2 set fieldName2 = @value2
if @@error<>0
begin
rollback transaction stk_savePoint
commit transaction
return
end
else
begin
if @@rowcount = 0
rollback transaction
end
commit transaction
--如果第二个update出现错误,就返回到第一个update后提交,并且使用return截断后面的语句继续运行
--如果第二个update正确执行,就是更新的行数是0,就回滚整个事务,把第一个update执行的结果也取消
[/code]