Je commence juste à apprendre le T-SQL et je pourrais avoir besoin d'aide pour comprendre ce qui se passe dans un bloc de code particulier. J'ai modifié un code à an answer I received in a previous question, et voici le code en question:Que se passe-t-il dans ce code T-SQL? (Concaténant les résultats d'une instruction SELECT)
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 ...
Le code T-SQL fait exactement ce que je veux, ce qui est de faire un seul résultat sur la base des résultats d'une requête, qui sera ensuite être utilisé dans une autre requête.
Toutefois, je ne peux pas comprendre comment l'instruction SELECT @column_list =...
place plusieurs valeurs dans une seule chaîne de caractères en étant dans une instruction SELECT
. Sans l'affectation à @column_list
, l'instruction SELECT
retournerait simplement plusieurs lignes. Comment se fait-il qu'en ayant la variable dans l'instruction SELECT
, les résultats soient "aplatis" en une seule valeur? Comment dois-je lire ce T-SQL pour bien comprendre ce qui se passe?
n'a pas besoin de 'STUFF()' quand vous le faites de cette façon: 'SELECT @ var = ISNULL (@var + ',', '') + col FROM TABLE' –
@KM, ouais, laissez-moi ajouter cette technique. –
il est probablement plus efficace de mettre par défaut @var à la chaîne vide: '' et d'éliminer le ISNULL() fait pour chaque ligne et de faire le STUFF une fois à la toute fin, cependant ... –