临时表与表变量的深入探究(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秒左右,和临时表几乎一样
相关新闻>>
最新推荐更多>>>
- 发表评论
-
- 最新评论 更多>>