2011-07-28 49 views
2

脚本表和样本数据SQL服务器 - 更新与另一列值的列作为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') 

我需要更新#TEMPTABLE1使

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

可能重复(http://stackoverflow.com/questions/122942/how-to-return-multiple-values-in- [如何在一列(T-SQL)?返回多个值] one-column-t-sql) –

+1

**不要将CSV数据存储在COLUMS中! EVER!** –

+0

Joel,我没有在列中存储CSV数据。这是报告的一部分,我遇到了这个问题并在这里发布。 –

回答

7

听起来像OP想更新语句。

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非常非常干净 –

0

将这项工作:

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

您不能按顺序发出多个插入o更新一列(因此单独陈述insertupdate陈述)。我看到两个选项:

插入然后更新

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 

这是非常麻烦的,但工程。

插入,而是选择到逗号分隔的列表
在这种情况下,你可以让你的主键ID和COL2(虽然我不知道我会推荐这)的组合,并插入值正如你以上所做的那样。然后,当你需要用逗号分隔的列表中,选择它是这样,例如,使用整理(由Pinal Dave提及):

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

首先创建一个功能:

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 

,然后用它在你的更新:

UPDATE #TEMPTABLE1 set Col1 = CommaValues(ID) 
3

似乎你的问题的关键是连接#temptable2中的值基于id。 Jeff Moden在这方面有优秀的文章Concatenation Functions and Some Tuning Myths

虽然整篇文章值得一读,但关键是您可以轻松地将Stuff和For XML Path与子查询结合使用以基于ID列进行连接。然后,您可以随时使用它来更新#temptable1。

编辑添加例如

级联将大致如下:

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

使用FOR XML方法时需要注意字符实体化。 添加INSERT INTO#TEMPTABLE2(ID,COL2)VALUES(3,N'<')并查看是否正确表示“<”符号。 更改为().value('。','nvarchar(10)')以避免此问题。 – etliens

相关问题