一尘不染

此T-SQL代码中发生了什么?(包含SELECT语句的结果)

sql

我刚刚开始学习T-
SQL,并可以使用一些帮助来了解特定代码块中的情况。我在上一个问题中得到的答案中修改了一些代码,这是有问题的代码:

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_list,则该SELECT语句将仅返回多行。通过在SELECT语句中包含变量,结果如何被“展平”到一个值中呢?我应该如何阅读此T-
SQL以正确了解正在发生的事情?


阅读 148

收藏
2021-05-23

共1个答案

一尘不染

在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
2021-05-23