动态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
这一个语句是怎么循环赋值的?
请高手帮下
...全文
115 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
  • 打赏
  • 举报
回复
这个?(*^__^*) 嘻嘻……不是高手
基于遗传算法的新的异构分布式系统任务调度算法研究(Matlab代码实现)内容概要:本文档围绕基于遗传算法的异构分布式系统任务调度算法展开研究,重点介绍了一种结合遗传算法的新颖优化方法,并通过Matlab代码实现验证其在复杂调度问题中的有效性。文中还涵盖了多种智能优化算法在生产调度、经济调度、车间调度、无人机路径规划、微电网优化等领域的应用案例,展示了从理论建模到仿真实现的完整流程。此外,文档系统梳理了智能优化、机器学习、路径规划、电力系统管理等多个科研方向的技术体系与实际应用场景,强调“借力”工具与创新思维在科研中的重要性。; 适合人群:具备一定Matlab编程基础,从事智能优化、自动化、电力系统、控制工程等相关领域研究的研究生及科研人员,尤其适合正在开展调度优化、路径规划或算法改进类课题的研究者; 使用场景及目标:①学习遗传算法及其他智能优化算法(如粒子群、蜣螂优化、NSGA等)在任务调度中的设计与实现;②掌握Matlab/Simulink在科研仿真中的综合应用;③获取多领域(如微电网、无人机、车间调度)的算法复现与创新思路; 阅读建议:建议按目录顺序系统浏览,重点关注算法原理与代码实现的对应关系,结合提供的网盘资源下载完整代码进行调试与复现,同时注重从已有案例中提炼可迁移的科研方法与创新路径。
【微电网】【创新点】基于非支配排序的蜣螂优化算法NSDBO求解微电网多目标优化调度研究(Matlab代码实现)内容概要:本文提出了一种基于非支配排序的蜣螂优化算法(NSDBO),用于求解微电网多目标优化调度问题。该方法结合非支配排序机制,提升了传统蜣螂优化算法在处理多目标问题时的收敛性和分布性,有效解决了微电网调度中经济成本、碳排放、能源利用率等多个相互冲突目标的优化难题。研究构建了包含风、光、储能等多种分布式能源的微电网模型,并通过Matlab代码实现算法仿真,验证了NSDBO在寻找帕累托最优解集方面的优越性能,相较于其他多目标优化算法表现出更强的搜索能力和稳定性。; 适合人群:具备一定电力系统或优化算法基础,从事新能源、微电网、智能优化等相关领域研究的研究生、科研人员及工程技术人员。; 使用场景及目标:①应用于微电网能量管理系统的多目标优化调度设计;②作为新型智能优化算法的研究与改进基础,用于解决复杂的多目标工程优化问题;③帮助理解非支配排序机制在进化算法中的集成方法及其在实际系统中的仿真实现。; 阅读建议:建议读者结合Matlab代码深入理解算法实现细节,重点关注非支配排序、拥挤度计算和蜣螂行为模拟的结合方式,并可通过替换目标函数或系统参数进行扩展实验,以掌握算法的适应性与调参技巧。

34,872

社区成员

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

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