一个SELECT语句引发的迭代(SELECT @local_variable = expression 的妙用)

李战 2006-04-03 01:20:45
一个SELECT语句引发的迭代(SELECT @local_variable = expression 的妙用)
作者:李战(leadzen)

  在用Transact-SQL编写程序过程中,经常会遇到针对某个查询的每一行记录进行某种迭代运算的操作。通常情况下,我们都会定义一个该查询的游标,然后用循环语句来取出每一行进行迭代处理。但对于某些计算性质的迭代,巧妙使用SELECT @local_variable = expression的形式却能取得更好的效果。

  我们来看看一个例子,有表T,只含一个字符字段F1,内容如下
T(F1)
------
A
B
C
D
E

  要求写一段Transact-SQL,返回'A,B,C,D,E'形式的结果,即将每一行记录用逗号串起来。这是一个典型的查询结果迭代操作。

  用游标来迭代可能的形式是:

declare @result varchar(8000)
declare @s varchar(32)
declare c cursor FORWARD_ONLY READ_ONLY for
select F1 from T order by F1
set @result = ''
open c
fetch next from c into @s
while @@fetch_status = 0
begin
set @result = case when @result='' then @s else @result + ',' + @s end
fetch next from c into @s
end
deallocate c
select @result

  但用SELECT @local_variable = expression的形式就可改成这样:

declare @result varchar(8000)
set @result = ''
select @result = @result + case when @result='' then F1 else ','+F1 end from T order by F1
select @result

  分析二者的执行计划发现,SELECT迭代法的执行计划比游标迭代法的执行计划简单多了,而且非常符合一般SELECT语句的执行计划。

  查看SQL Server的帮助文档是这样说的:

------------------------------------------------------------------------------
SELECT @local_variable

指定将(使用 DECLARE @local_variable 创建的)给定的局部变量设置为指定的表达式。

建议将 SET @local_variable 而不是 SELECT @local_variable 用于变量赋值。

......

注释

SELECT @local_variable 通常用于将单个值返回到变量中。例如,如果 expression 为列名,则返回多个值。如果 SELECT 语句返回多个值,则将返回的最后一个值赋给变量。

如果 SELECT 语句没有返回行,变量将保留当前值。如果 expression 是不返回值的标量子查询,则将变量设为 NULL。
......
-------------------------------------------------------------------------------

  注意其中的这句话“如果 SELECT 语句返回多个值,则将返回的最后一个值赋给变量”。
  虽然如此,但实际的执行结果的确都曾对每一行记录执行过@local_variable = expression,只是最后一行保留下来。

  而SELECT迭代的巧妙之处就是在expression表达式中又引用了@local_variable自身,很完美地将迭代计算融入SELECT语句内部的执行中!

  这样的迭代执行计划非常精简,又无需分配和释放游标,书写又精简,不能不说巧妙啊!

  感谢www.cndev.org的sea026和乌烟提供素材,以及各位大牛小牛的牛角尖啊...

李战(leadzen) 2006-3-24
...全文
250 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
撸大湿 2006-04-03
  • 打赏
  • 举报
回复
一般我们都 select @result = @result +","+ F1 from table where 条件
然后 stuff(..)
zlp321002 2006-04-03
  • 打赏
  • 举报
回复
--这种方式很多人都知道.
Guizhi 2006-04-03
  • 打赏
  • 举报
回复
mark
01、数据介绍 在量化业绩说明会文本时,研究者通常采用自然语言处理(NLP)技术来提取关键特征,在构建管理层或投资者的情感语调时,普遍采用“净正面语调”作为核心指标。其计算公式通常为:净正面语调 = (正面词汇数 − 负面词汇数)/(正面词汇数 + 负面词汇数),该指标的取值范围在[-1, 1]之间,数值越大,表明发言者的情感语调越积极。 数据名称:上市公司业绩说明会文本+情感语调 数据年份:2005-2024年 02、数据指标 服务业种类、服务业收入(万元)和服务业收入占比数据提取都来自:根据上市公司财务报表中经营范围的描述,将与主营业务相关的生产性服务分为以下八类:(1)技术支持服务,包括维修、保养、安装与检测等基本技术支持与售后服务;(2)销售服务,包括分销、批发、零售和国际贸易等;(3)咨询服务,包括产品咨询、管理咨询以及市场咨询等;(4)培训服务;(5)租赁服务,包括产品租赁和设备租赁等;(6)研发与信息服务,包括设计、研发、开发、维护、升级、转让、技术指导、数据及信息处理服务、系统集成、系统运营维护以及综合技术服务等;(7)金融服务,包括融资与保险等金融服务;(8)物流服务,包括物流、装卸、搬运、仓储和运输等。具体处理方法:按照关键词检索企业是否开展上述八类服务,在此基础上对服务种类进行加总,得到代表企业服务业务种类的变量。 问题序号:业绩说明会提问问题的排序 提问内容:投资者提问内容 提问时间:投资者提问时间 回答人:回复投资者提问的人员 回答时间:回复投资者提问的时间 回答内容:对投资者提问的具体回复内容 正面词汇数量:回答内容中识别出的正面词汇数量 负面词汇数量:回答内容中识别出的负面词汇数量 正面词汇数比例:上市公司业绩说明会管理层回答所用的正面语调词汇数目占管理层回答词汇总数的比例 负面词汇数比例:上市公司业绩说明会

34,876

社区成员

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

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