动态SQL的简单使用问题

linguojin11 2008-08-05 09:09:53
drop table tb
go
create table tb(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' )

go



declare @sql varchar(100)
set @sql='A'
select @sql=@sql+','+a
from tb
group by a

print @sql

结果:
A,a,b,c,d,e


这是行转列中使用的动态SQL
我就是不懂他到底是怎么循环产生的。
select @sql=@sql+','+a
from tb
group by a
这一个语句是怎么循环赋值的?
请高手帮下
...全文
98 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
wwwtyb 2008-08-06
  • 打赏
  • 举报
回复
动态SQL的原理是这样的,在组装@sql变量前,现将表中关心的行全部选择出来,然后系统会自动将这些行内的值这个链到@sql中,组装字符串.为了更好的证明这一点,可以给记录排一下序.如果按照楼主的理解,那么每次就只有一条记录被选择的话,那么排序节的有无,对输出结果没有什么影响才对应该还是"A,a,b,c,d,e",然而结果却是出现了"A,e,d,c,b,a",所以可以证明字符串组装是出现在查询之后的,是查询现将满足条件的记录选择出来,然后再按照从头到尾链接到字符变量@sql中的.
zhiguo2008 2008-08-06
  • 打赏
  • 举报
回复
上面结果的根本原因就是我们用了一个变量来记录了select 检索每一行的足迹
hyqwan11112 2008-08-06
  • 打赏
  • 举报
回复
6楼高见,学习了!
brother2605 2008-08-06
  • 打赏
  • 举报
回复
其实楼上几位也大概说清楚了这个过程,我再补充一下。
首先需要明确
select @sql=@sql+','+a
from tb
group by a
是一个赋值的过程,我们来做个测试:
declare @table table(A char(1))
declare @sql varchar(100)

insert @table
select'a'union all
select'b'union all
select'c'union all
select'd'union all
select'e'

select @sql=A from @table
select @sql
这段代码最终@sql这个变量输出的值是'e',从这里我们其实可以看出,当将一个列直接赋值给一个变量时其实最终得到的是这一列的最后一个值。
从而我们可以不难看出,其实上面结果的根本原因就是我们用了一个变量来记录了select 检索每一行的足迹,诚如楼上所标示的那样:
1: select @sql=@sql+','+a @sql='A,a' 记录移动到下一行
2:select @sql=@sql+','+a @sql='A,a,b' ->
3: select @sql=@sql+','+a @sql='A,a,b,c' ->
......
直到最后一行纪录。
其实很容易理解,这个技巧就是利用了变量的作用域的特性。不要想得复杂了。
love小在在 2008-08-06
  • 打赏
  • 举报
回复
1: select @sql=@sql+','+a @sql='A,a' 记录移动到下一行
2:select @sql=@sql+','+a @sql='A,a,b' ->
3: select @sql=@sql+','+a @sql='A,a,b,c' ->
......

最后打印@sql值为 A,a,b,c,d,e

comszsoft 2008-08-06
  • 打赏
  • 举报
回复
帮顶
幸运的意外 2008-08-06
  • 打赏
  • 举报
回复
楼主朋友,其实并不是像你想象的那样,如果按照你的理解,那么用set对字符串赋值和select应该是一样的,然而结果却不一样,set会出现错误不能正常运行.

其实这个动态SQL的原理是这样的,在组装@sql变量前,现将表中关心的行全部选择出来,然后系统会自动将这些行内的值这个链到@sql中,组装字符串.为了更好的证明这一点,可以给记录排一下序.如果按照楼主的理解,那么每次就只有一条记录被选择的话,那么排序节的有无,对输出结果没有什么影响才对应该还是"A,a,b,c,d,e",然而结果却是出现了"A,e,d,c,b,a",所以可以证明字符串组装是出现在查询之后的,是查询现将满足条件的记录选择出来,然后再按照从头到尾链接到字符变量@sql中的.
cyc_cheng 2008-08-06
  • 打赏
  • 举报
回复

取出一条纪录,与原来@sql相连接赋值给@sql,继续下一条....重复
hyqwan11112 2008-08-05
  • 打赏
  • 举报
回复
自己的理解:查询是一行一行处理的,这也就是个循环啊!
utpcb 2008-08-05
  • 打赏
  • 举报
回复
这个?(*^__^*) 嘻嘻……不是高手

34,591

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧