临时表与表变量的深入探究(3)

来源:未知 责任编辑:责任编辑 发表时间:2015-09-17 09:42 点击:
insert into #T select '临时表:原值'
insert into @T select '表变量:原值'
 
BEGIN TRANSACTION
     update #T set s='临时表:被更新'
     update @T set s='表变量:被更新'
ROLLBACK TRANSACTION
  www.2cto.com  
select * from #T
select * from @T 
 
结果发现,临时表得值被回滚,表变量并没有回滚。可以得出,表变量不受事务影响。
 
5)UDF中的不同
 
--表变量
CREATE FUNCTION dbo.example1 ( ) RETURNS INT AS 
BEGIN 
    DECLARE @t1 TABLE (i INT) 
    INSERT @t1 VALUES(1) 
    INSERT @t1 VALUES(2) 
    UPDATE @t1 SET i = i + 5 
    DELETE @t1 WHERE i < 7 
 
    DECLARE @max INT 
    SELECT @max = MAX(i) FROM @t1 
    RETURN @max 
END   www.2cto.com  
GO;
--临时表
CREATE FUNCTION dbo.example2 ( ) RETURNS INT 
AS 
BEGIN 
    CREATE TABLE #t1 (i INT) 
    INSERT #t1 VALUES(1) 
    INSERT #t1 VALUES(2) 
    UPDATE #t1 SET i = i + 5 
    DELETE #t1 WHERE i < 7 
 
    DECLARE @max INT 
    SELECT @max = MAX(i) FROM #t1 
    RETURN @max 
END  
GO
--物理表
CREATE FUNCTION dbo.example3 ( ) RETURNS INT AS 
BEGIN 
    CREATE TABLE table1 ( id INT IDENTITY, name VARCHAR(32) ) 
    INSERT table1(name) VALUES('aaron') 
    RETURN SCOPE_IDENTITY() 
END 
  www.2cto.com  
运行后,可以发现,函数内无法访问临时表,也无法创建实体表,同理也无法更新新增删除实体表的记录,但可以使用表变量来进行运算和操作
 
6) 性能对比
 
if OBJECT_ID('tempdb..#T') is not null drop table #T
create table #T (s char(1024))
declare @i int = 0
while @i<100000
begin
  insert into #T select '临时表:原值'
  set @i=@i+1
END
SELECT * FROM #T  --3秒左右
--3秒
go
 
declare @V table (s char(1024))
declare @i int = 0
while @i<100000
begin
  insert into @V select '表变量:原值'
  set @i=@i+1
END
SELECT * FROM @V  --3秒左右,和临时表几乎一样
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
用户名: 验证码:点击我更换图片
最新评论 更多>>

推荐热点

  • Request.ServerVariables 参数大全
  • 查看sql修改痕迹(SQL Change Tracking on Table)
  • 写给MongoDB开发者的50条建议Tip1
  • Percolator与分布式事务思考(二)
  • App数据层设计及云存储使用指南
  • PostgreSQL启动过程中的那些事三:加载GUC参数
  • SQL Server、Oracle、db2所提供的简装版(Express)比较
  • PostgreSQL 安装问题
  • 【自主研发-贡献给SQL Server人员】索引诊断与优化软件使用说明
网站首页 - 友情链接 - 网站地图 - TAG标签 - RSS订阅 - 内容搜索
Copyright © 2008-2015 计算机技术学习交流网. 版权所有

豫ICP备11007008号-1