T-sql陷阱_表变量

sql server表变量与临时表又一个不同之处 

有些时候不一定按照你的理想顺序执行

demo

declare @maxid int
if object_id('tempdb.dbo.#tmp','U') is not null
    drop table #tmp
create table #tmp
(
    ca int  not null identity(1,1),
    cb varchar(10)
)

insert into #tmp(cb)values('is 1'),(null),('is 3')
select @maxid=SCOPE_IDENTITY() 

declare @i int=1
while @i<=@maxid
    begin
        declare  @tmp_a table (id int ,cb varchar(10))   

        if object_id('tempdb.dbo.#tmp_b','U') is not null
            drop table #tmp_b
        create table #tmp_b ( ca int , cb varchar(10) )
        
        insert into @tmp_a select * from #tmp where ca=@i
        insert into #tmp_b select * from #tmp where ca=@i

        select @i=@i+1
    end

--查询1
select * from @tmp_a 
--查询2 
select * from #tmp_b

如果没有踩到此坑的人,会认为以上查询1和查询2的结果相同,因为按照正常的逻辑顺序就该这样,但是结果真的是这样的吗,不放copy试试

实际结果如下

 


 

 

实际执行顺序如下

 

 

posted @ 2015-12-07 16:05  simplelg17  阅读(152)  评论(0编辑  收藏  举报