【问题标题】:What is happening in this T-SQL code? (Concatenting the results of a SELECT statement)这个 T-SQL 代码发生了什么? (连接 SELECT 语句的结果)
【发布时间】:2011-02-03 01:50:05
【问题描述】:

我刚刚开始学习 T-SQL,并且可以使用一些帮助来理解特定代码块中发生的事情。我在an answer I received in a previous question修改了一些代码,这里是有问题的代码:

DECLARE @column_list AS varchar(max) 
SELECT @column_list = COALESCE(@column_list, ',') + 
    'SUM(Case When Sku2=' + CONVERT(varchar, Sku2) + 
    ' Then Quantity Else 0 End) As [' + 
    CONVERT(varchar, Sku2) + ' - ' + 
    Convert(varchar,Description) +'],'
FROM OrderDetailDeliveryReview 
Inner Join InvMast on SKU2 = SKU and LocationTypeID=4
GROUP BY Sku2 , Description
ORDER BY Sku2 

Set @column_list = Left(@column_list,Len(@column_list)-1)

Select @column_list

----------------------------------------

1 row is returned:
,SUM(Case When Sku2=157 Then Quantity Else 0 End) As [157 -..., SUM(Case ...

T-SQL 代码完全符合我的要求,即根据查询结果生成单个结果,然后将其用于另一个查询。

但是,我无法弄清楚 SELECT @column_list =... 语句是如何通过在 SELECT 语句中将多个值放入单个字符串中的。如果没有分配给@column_listSELECT 语句将简单地返回多行。通过在SELECT 语句中包含变量,结果如何“扁平化”为一个值?我应该如何阅读此 T-SQL 才能正确理解发生了什么?

【问题讨论】:

    标签: sql sql-server sql-server-2005 tsql dynamic-sql


    【解决方案1】:

    您将需要查看 COALESCE 函数。可以看到一篇描述正在发生的事情的好文章here

    【讨论】:

    • @Jon - 研究COALESCE 函数肯定有帮助。什么是没有COALESCE 函数,NULL 被返回。这是因为字符串不能添加到NULL 值吗?
    • 嗨,Ben,任何添加到 null 的东西都会导致 null
    • @Ben McCormack ANSI NULL 行为将给出 NULL + str -> NULL。非 ANSI 行为将给出 NULL + str -> str - 您可以通过 SET CONCAT_NULL_YIELDS_NULL OFF 获得这种非标准行为。
    • @Cade Roux 感谢您在我之后添加另一条评论,我从来不知道!
    【解决方案2】:

    在 SQL Server 中:

    SELECT @var = @var + col
    FROM TABLE
    

    实际上连接了这些值。这是一种怪癖模式(我目前无法找到对功能文档的引用——该功能已在 SQL Server 社区中使用多年)。如果 @var 在开始时为 NULL(即未初始化的值),那么您需要 COALESCE 或 ISNULL(并且您经常会使用分隔符):

    SELECT @var = ISNULL(@var, '') + col + '|'
    FROM TABLE
    

    或者这样创建一个逗号分隔的列表,然后只删除前导逗号:

    SELECT @var = ISNULL(@var, '') + ',' + col
    FROM TABLE
    
    SET @var = STUFF(@var, 1, 1, '')
    

    或(感谢KM,依靠 NULL + ',' 产生 NULL 以消除列表中第一项对 STUFF 的需求):

    SELECT @var = ISNULL(@var + ',', '') + col
    FROM TABLE 
    

    或者用这个来创建一个带有前导、分隔和尾随逗号的列表:

    SELECT @var = ISNULL(@var, ',') + col + ','
    FROM TABLE
    

    【讨论】:

    • 当你这样做时不需要STUFF()SELECT @var=ISNULL(@var+',','')+col FROM TABLE
    • @KM,是的,让我添加该技术。
    • 默认@var 为空字符串:'' 并消除为每一行完成的 ISNULL() 并在最后只执行一次 STUFF 可能更有效,不过...
    • 优秀的答案。谢谢你的解释。这将有很大帮助!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-18
    • 2017-07-17
    • 1970-01-01
    相关资源
    最近更新 更多