我刚刚开始学习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以正确了解正在发生的事情?
SELECT @column_list =...
SELECT
@column_list
在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