Что происходит в этом коде T-SQL? (Конкатенация результатов оператора SELECT)

Я только начинаю изучать 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, чтобы правильно понять, что происходит?

4 голоса | спросил Ben McCormack 31 MarpmWed, 31 Mar 2010 22:42:17 +04002010-03-31T22:42:17+04:0010 2010, 22:42:17

2 ответа


0

В 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
ответил Cade Roux 31 MarpmWed, 31 Mar 2010 23:02:14 +04002010-03-31T23:02:14+04:0011 2010, 23:02:14
0

Вы захотите заглянуть в функцию COALESCE. Хорошую статью с описанием происходящего можно найти здесь .

ответил Jon 31 MarpmWed, 31 Mar 2010 22:47:22 +04002010-03-31T22:47:22+04:0010 2010, 22:47:22

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132