博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
比较表变量和临时表(很不错)
阅读量:2286 次
发布时间:2019-05-09

本文共 6128 字,大约阅读时间需要 20 分钟。

来自:http://blog.csdn.net/roy_88/article/details/8461942 

1、回滚事务对表变量无效,回滚事务对临时表有效

[sql] 
  1. SET NOCOUNT ON;  
  2.   
  3. DECLARE @TestTable TABLE (  
  4.   RowID   INT IDENTITY PRIMARY KEY CLUSTERED,  
  5.   Name     VARCHAR(9) NOT NULL UNIQUE,  
  6.   Age     TINYINT NULL,  
  7.   rowguid UNIQUEIDENTIFIER NOT NULL DEFAULT(newid()));  
  8.   
  9. begin tran  
  10.   
  11. INSERT INTO @TestTable (Name, Age) VALUES ('Roy', 25),('中国风', 21);  
  12. rollback tran  
  13.   
  14. SELECT 'Insert rows' as Action, * FROM @TestTable;  
  15. /*  
  16. Action  RowID   Name    Age rowguid  
  17. Insert rows 1   Roy 25  84C4F6CC-3AB3-4D7D-8779-0DCF3414AB61  
  18. Insert rows 2   中国风 21  1DB02A77-F20E-4326-A4E4-023CE9F5DEA7  
  19. */  
  20. go  
  21. if OBJECT_ID('Tempdb..#TestTable'is not null  
  22.     drop table #TestTable  
  23. CREATE TABLE #TestTable (  
  24.   RowID   INT IDENTITY PRIMARY KEY CLUSTERED,  
  25.   Name     VARCHAR(9) NOT NULL UNIQUE,  
  26.   Age     TINYINT NULL,  
  27.   rowguid UNIQUEIDENTIFIER NOT NULL DEFAULT(newid()));  
  28.    
  29.  begin tran  
  30.    
  31. INSERT INTO #TestTable (Name,Age) VALUES ('Roy', 25),('中国风', 21);  
  32. rollback tran  
  33. SELECT 'Insert rows' as Action,* FROM #TestTable  
  34. /*  
  35. 无记录  
  36. */  

2、临时表支持用into生成临时表/TRUNCATE清空表/set identity_insert/drop table,表变量不支持

[sql] 
  1. use tempdb  
  2. go  
  3. if OBJECT_ID('Tempdb..#TestTable'is not null  
  4.     drop table #TestTable  
  5. --into  
  6. select 1 as ID into #TestTable  
  7.   
  8. --TRUNCATE  
  9. TRUNCATE table #TestTable  
  10. go  
  11. if OBJECT_ID('Tempdb..#TestTable2'is not null  
  12.     drop table #TestTable2  
  13. Create table #TestTable2(ID int identity,Num int)  
  14. go  
  15. set identity_insert #TestTable2 on;  
  16. insert into #TestTable2(ID,Num) values(1,20)  
  17. set identity_insert #TestTable2 off;  
  18. go  
  19. drop table #TestTable,#TestTable2  
3、表变量可以在创建表时定义主健PRIMARY KEY和唯一约束UNIQUE和检查check

[sql] 
  1. use tempdb  
  2. go  
  3. SET NOCOUNT ON;  
  4. -- 记录当前tempdb里的表对象ID  
  5. if OBJECT_ID('Tempdb..#test'is not null  
  6.     drop table #test  
  7. SELECT object_id   
  8.   INTO #test   
  9.   FROM tempdb.sys.tables;  
  10. GO  
  11.   
  12. --创建表变量  
  13. DECLARE @temp TABLE (  
  14.     RowID INT NOT NULL,  
  15.     ColA INT NOT NULL check(ColA<10),  
  16.     ColB char(1),  
  17.     ColC char(1),  
  18.     ColD char(1),  
  19.     PRIMARY KEY NONCLUSTERED (RowID, ColA),  
  20.     UNIQUE CLUSTERED (ColB, ColC),  
  21.     UNIQUE NONCLUSTERED (ColC, ColD));  
  22.   
  23. INSERT INTO @temp VALUES (1, 1, 'B'NULL'D');  
  24.   
  25.   
  26. --获取表变量对象的ID  
  27. DECLARE @object_id INT;  
  28. SELECT @object_id =   
  29.   (SELECT object_id   
  30.      FROM tempdb.sys.tables  
  31.    EXCEPT  
  32.    SELECT object_id   
  33.      FROM #test);  
  34.   
  35. -- 获取表变量的索引名  
  36.   
  37. ;with IXC  
  38. as  
  39. (  
  40. SELECT  IXC.object_id,  
  41.         IXC.index_id,  
  42.         IXC.index_column_id,  
  43.         IXC.is_descending_key,  
  44.         IXC.is_included_column,  
  45.         column_name = C.name  
  46.   FROM tempdb.sys.index_columns IXC  
  47.        JOIN tempdb.sys.columns C  
  48.          ON IXC.object_id = C.object_id  
  49.         AND IXC.column_id = C.column_id  
  50.  WHERE IXC.object_id = @object_id  
  51. )  
  52. select   
  53.         IX.object_id,  
  54.         index_name = IX.name,  
  55.         index_type_desc = IX.type_desc,  
  56.         IX.is_unique,  
  57.         IX.is_primary_key,  
  58.         IX.is_unique_constraint,  
  59.         IX.is_disabled,  
  60.         index_columns = STUFF(IXC_COL.index_columns, 1, 2, N'')  
  61. from tempdb.sys.indexes as IX  
  62. CROSS APPLY(  
  63. SELECT index_columns =   
  64. (SELECT   
  65.     N', ' + QUOTENAME(column_name)+ CASE is_descending_key WHEN 1 THEN N' DESC' ELSE N'' END  
  66. FROM IXC  
  67. WHERE object_id = IX.object_id AND index_id = IX.index_id AND is_included_column = 0 ORDER BY index_column_id FOR XML PATH(''), ROOT('r'), TYPE).value('/r[1]''nvarchar(max)')      
  68. )IXC_COL  
  69. where IX.object_id= @object_id  
  70. /*  
  71. object_id   index_name  index_type_desc is_unique   is_primary_key  is_unique_constraint    is_disabled index_columns  
  72. 1572200651  UQ__#5DB5E0C__D87C70A35F9E293D  CLUSTERED   1   0   1   0   [ColB], [ColC]  
  73. 1572200651  UQ__#5DB5E0C__287C70A3627A95E8  NONCLUSTERED    1   0   1   0   [ColC], [ColD]  
  74. 1572200651  PK__#5DB5E0C__A5CBEAB465570293  NONCLUSTERED    1   1   0   0   [RowID], [ColA]  
  75. */  
  76. GO  
  77. drop table #test  

4、临时表名116个字符,表变量支持128个字符

[sql] 
  1. CREATE TABLE #TestTable12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890 (  
  2. --                    ^         ^         ^         ^         ^         ^         ^         ^         ^         ^         ^         ^  
  3. --                   10         20        30        40        50        60        70        80        90       100       110       120  
  4.   RowID INT IDENTITY PRIMARY KEY CLUSTERED,  
  5. );  
  6. GO  
  7. /*  
  8. 消息 193,级别 15,状态 1,第 2 行  
  9. 以 '#TestTable12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890' 开头的对象名或列名太长。最大长度为 116 个字符。  
  10. */  
  11.   
  12.   
  13. declare      @TestTable1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678 TABLE(  
  14. --                    ^         ^         ^         ^         ^         ^         ^         ^         ^         ^         ^         ^  
  15. --                   10         20        30        40        50        60        70        80        90       100       110       120  
  16.   RowID INT IDENTITY PRIMARY KEY CLUSTERED);  


5、查看表变量的日志变化

CHECKPOINT将当前数据库的全部脏页写入磁盘。“脏页”是已输入缓存区高速缓存且已修改但尚未写入磁盘的数据页。

[sql] 
  1. USE tempdb   
  2. GO  
  3. ---- 截断日志,测试开始1  
  4. CHECKPOINT   
  5. -- 记录当前tempdb里的表对象ID    
  6. if OBJECT_ID('Tempdb..#test'is not null    
  7.     drop table #test    
  8. SELECT object_id     
  9.   INTO #test     
  10.   FROM tempdb.sys.tables;  
  11. go  
  12. DECLARE @TransactionTest TABLE (  
  13. ID INT PRIMARY KEY,  
  14. SomeCol VARCHAR(20)  
  15. );  
  16. --获取表变量对象的ID  
  17. DECLARE @object_id INT;    
  18. SELECT @object_id =     
  19.   (SELECT object_id     
  20.      FROM tempdb.sys.tables    
  21.    EXCEPT    
  22.    SELECT object_id     
  23.      FROM #test);   
  24.        
  25. INSERT INTO @TransactionTest (ID, SomeCol) VALUES (0,'Row1');  
  26. INSERT INTO @TransactionTest (ID, SomeCol) VALUES (1,'Row2');  
  27.   
  28. BEGIN TRANSACTION;  
  29. INSERT INTO @TransactionTest (ID, SomeCol) VALUES (2,'Row3');  
  30. ROLLBACK TRANSACTION;  
  31.   
  32. SELECT * FROM @TransactionTest;  
  33.   
  34. SELECT Operation, AllocUnitName, [Begin Time], [End Time]  
  35. FROM fn_dblog(NULLNULL)  
  36. where AllocUnitName like '%'+object_Name(@object_id)+'%'  
  37. GO  


最后三条记录都是插入记录日志

[sql] 
  1. USE tempdb   
  2. GO  
  3. -- 截断日志,测试开始2  
  4. CHECKPOINT   
  5. -- 记录当前tempdb里的表对象ID    
  6. if OBJECT_ID('Tempdb..#test'is not null    
  7.     drop table #test    
  8. SELECT object_id     
  9.   INTO #test     
  10.   FROM tempdb.sys.tables;  
  11. go  
  12.   
  13. DECLARE @TransactionTest TABLE (  
  14. ID INT PRIMARY KEY,  
  15. SomeCol VARCHAR(20)  
  16. );  
  17. --获取表变量对象的ID  
  18. DECLARE @object_id INT;    
  19. SELECT @object_id =     
  20.   (SELECT object_id     
  21.      FROM tempdb.sys.tables    
  22.    EXCEPT    
  23.    SELECT object_id     
  24.      FROM #test);   
  25.        
  26. INSERT INTO @TransactionTest (ID, SomeCol)  
  27. VALUES  
  28. (0,'Row1'),  
  29. (1,'Row2'),  
  30. (1,'Row3');--主健重复  
  31. SELECT * FROM @TransactionTest;  
  32. SELECT Operation, AllocUnitName, [Begin Time], [End Time]   
  33.   FROM fn_dblog(NULLNULL)  
  34.   where AllocUnitName like '%'+object_Name(@object_id)+'%';  

插入第3条记录出错,有删除前两条的动作

6、临时表有两种类型:本地表和全局表。它们在名称、可见性以及可用性上有区别。本地临时表的名称以单个数字符号 (#) 打头;它们仅对当前的用户连接是可见的;当用户从 SQL Server 实例断开连接时被删除。全局临时表的名称以两个数字符号 (##) 打头,创建后对任何用户都是可见的,当所有引用该表的用户从 SQL Server 断开连接时被删除。

[sql] 
  1. --本地临时表  
  2. if OBJECT_ID('Tempdb..#1'is not null  
  3.     drop table #1  
  4. exec('select 1 as ID into #1')  
  5. select * from #1  
  6. /*  
  7. (1 行受影响)  
  8. 消息 208,级别 16,状态 0,第 4 行  
  9. 对象名 '#1' 无效。  
  10. */  
  11.   
  12. --全局临时表  
  13. if OBJECT_ID('Tempdb..##1'is not null  
  14.     drop table #1  
  15. exec('select 1 as ID into ##1')  
  16. select * from ##1  
  17. /*  
  18. ID  
  19. 1  
  20. */  
你可能感兴趣的文章
UIView常用属性和函数
查看>>
UIButton常用属性和函数详解
查看>>
UILabel常用属性详解
查看>>
UITextField常用属性和方法详解
查看>>
“UITableView完美平滑滚动”阅读笔记
查看>>
UIImageView常用属性和方法
查看>>
UIImage常用属性和方法
查看>>
会报编译器警告的Xcode 6.3新特性:Nullability Annotations
查看>>
2015 Objective-C 三大新特性
查看>>
Objective-C中instancetype详解
查看>>
音频、视频框架概括说明
查看>>
手势(UIGestureXXX)使用详解
查看>>
UIMenuController和UIMenuItem,即iOS剪贴板
查看>>
新一代数据查询语言GraphQL来啦
查看>>
Simple Zend_Layout Example
查看>>
The Zend Framework MVC Architecture
查看>>
Framework框架分析总结
查看>>
Windows7下centOS 硬盘安装双系统
查看>>
GRUB引导程序参数
查看>>
phpMyAdmin简明安装教程
查看>>