动态SQL中set与select对变量赋值的影响

来源:互联网 发布:尽管手中空无一物 知乎 编辑:程序博客网 时间:2024/05/21 06:57

 在动态SQL中,存在着多种对字符变量赋值的方法.其中set和select使用的朋友最多.对于像我一样的小鸟来说,可能只是会用这两个方法而已,并没有真正理解这两个方法的真正内涵.我个人的理解是这样的:set只是对字符变量的一次赋值,可以是具体的字符串,也可以是一次查询的结果,但是这个结果必须是唯一一条记录且只有一个字段;而select方法功能比较大,它可以把一次查询的多行记录中的某列的值全部赋值到字符串变量(比如@sql)中.在组装@sql变量前,先将表中关心的行全部选择出来,然后系统会自动将这些行内的值链到@sql中,组装字符串.

举个例子:

declare  @tb table(a varchar(10) , b varchar(10) )
insert into @tb values('a' , '1' )
insert into @tb values('b' , '2' )
insert into @tb values('c' , '3')
insert into @tb values('d' , '4' )
insert into @tb values('e' , '5' )

declare @sql varchar(1000)
select @sql='A'
select @sql=@sql+','+a

from @tb
--order by a desc

print @sql

 

为了更好的证明这一点,可以给记录排一下序.如果按照楼主的理解,那么每次就只有一条记录被选择的话,那么排序节的有无,对输出结果没有什么影响才对应该还是"A,a,b,c,d,e",然而结果却是出现了"A,e,d,c,b,a",所以可以证明字符串组装是出现在查询之后的,是查询现将满足条件的记录选择出来,然后再按照从头到尾链接到字符变量@sql中的.