2011-07-28 4 views
2

Script pour la table et les données échantillonsSQL Server - Mettre à jour une colonne avec d'autres valeurs de la colonne au format CSV

CREATE TABLE #TEMPTABLE1(ID INT, COL1 NVARCHAR(10)) 
CREATE TABLE #TEMPTABLE2(ID INT, COL2 NVARCHAR(10)) 

INSERT INTO #TEMPTABLE1 (ID) VALUES(1) 
INSERT INTO #TEMPTABLE1 (ID) VALUES(2) 
INSERT INTO #TEMPTABLE1 (ID) VALUES(3) 

INSERT INTO #TEMPTABLE2 (ID,COL2) VALUES(1,'A') 
INSERT INTO #TEMPTABLE2 (ID,COL2) VALUES(1,'B') 
INSERT INTO #TEMPTABLE2 (ID,COL2) VALUES(1,'C') 
INSERT INTO #TEMPTABLE2 (ID,COL2) VALUES(2,'X') 
INSERT INTO #TEMPTABLE2 (ID,COL2) VALUES(2,'Y') 
INSERT INTO #TEMPTABLE2 (ID,COL2) VALUES(3,'Z') 

Je dois mettre à jour le #TEMPTABLE1 afin que

ID COL1 
--------- 
1 A,B,C 
2 X,Y 
3 Z 
+0

double possible de [Comment revenir plusieurs valeurs dans une colonne (T-SQL)?] (Http://stackoverflow.com/questions/122942/how-to-return-multiple-values-in- one-column-t-sql) –

+1

** NE PAS ENREGISTRER LES DONNEES CSV EN COLUMS! JAMAIS! ** –

+0

Joel, je ne stocke pas les données CSV dans la colonne. Cela fait partie du reporting et je suis tombé sur ce problème et posté ici. –

Répondre

7

OP voulait Ressemblait le une déclaration de mise à jour.

UPDATE [x] 
SET 
    [COL1] = STUFF 
      (
       (
        SELECT 
         N',' + [COL2] 
        FROM 
         [#TEMPTABLE2] AS [y] 
        WHERE 
         [y].[ID] = [x].[ID] 
        FOR XML PATH(''), TYPE 
       ).value(N'.', N'nvarchar(10)'), 
       1, 1, N'' 
      ) 
OUTPUT INSERTED.* 
FROM 
    [#TEMPTABLE1] AS [x] 
+2

+1 Très très propre –

0

Est-ce que ce travail:

INSERT INTO #TEMPTABLE1 SELECT ID,COL2 FROM #TEMPTABLE2 GROUP BY ID 
0

Vous ne serez pas en mesure d'émettre plusieurs insertions dans l'ordre t o mettre à jour une colonne (donc des instructions séparées insert et update). Je vois deux options:

Insérer puis Mettre à jour

INSERT INTO #TEMPTABLE2 (ID,COL2) VALUES(1,'A') 
UPDATE #TEMPTABLE2 SET COL2 = COL2 + ',' + B WHERE ID = 1 
UPDATE #TEMPTABLE2 SET COL2 = COL2 + ',' + C WHERE ID = 1 

Ceci est assez désordonné, mais fonctionne.

Insérer, mais sélectionnez dans une liste
délimité par des virgules Dans ce cas, vous pouvez faire de votre clé primaire la combinaison d'ID et COL2 (bien que je ne suis pas sûr que je recommanderais ce) et insérer les valeurs comme vous le faites ci-dessus. Ensuite, lorsque vous avez besoin de la liste délimitée par des virgules, sélectionnez comme tel, par exemple, en utilisant collationner (comme mentionné par Pinal Dave):

DECLARE @listStr VARCHAR(MAX) 
SELECT @listStr = COALESCE(@listStr+',' ,'') + Name 
FROM Production.Product 
1

d'abord créer une fonction:

CREATE FUNCTION CommaValues(@ID as INT) 
returns varchar(500) 
as 
begin 
DECLARE @DelimList as varchar(500) 

select @DelimList = COALESCE(@DelimList + ', ', '') + Col2 
from #TEMPTABLE2 
where ID = @ID 

return @DelimList 
end 

puis utiliser il dans votre mise à jour:

UPDATE #TEMPTABLE1 set Col1 = CommaValues(ID) 
3

Il semble que la clé de votre question concatène les valeurs de # temptable2 en fonction de l'ID. Jeff Moden a un excellent article sur ce sujet à Concatenation Functions and Some Tuning Myths

Bien que l'article en entier mérite d'être lu, l'élément clé est que vous pouvez facilement utiliser Stuff et For XML Path avec une sous-requête à concaténer basée sur la colonne ID. Ensuite, vous pouvez facilement utiliser cela pour mettre à jour votre # temptable1.

Modifier pour ajouter par exemple

La concaténation ressemblerait à peu près comme:

SELECT t1.ID,   
STUFF((SELECT ','+t2.value 
    FROM dbo.TestData t2 
    WHERE t1.ID = t2.SomeID FOR XML PATH('')),1,1,'') 
FROM dbo.TestData t1 
GROUP BY t1.ID 
+0

Vous devez être conscient de l'habilitation des caractères lors de l'utilisation de la méthode FOR XML. Ajouter INSERT IN # TEMPTABLE2 (ID, COL2) VALEURS (3, N '<') et voir si le symbole "<" est correctement représenté. Remplacez par() .value ('.', 'Nvarchar (10)') pour éviter le problème. – etliens

Questions connexes