在Update期间将多个行转换为逗号分隔的值

时间:2009-11-05 13:57:24

标签: sql-server-2000 concat

我有一个名为Method的临时表,因此:

DECLARE @CaseSites TABLE (
 BriefID  int,
 Method  varchar(60)
 -- other fields
)

方法将从另一个表中的几行填充 - CaseEventTypeList。

运行

SELECT * FROM CaseEventTypeList WHERE RefID = 1

给出

RefID TypeID
1  2
1  3
1  6

将此转换为单个逗号分隔的结果非常简单:

DECLARE @CETList varchar(30)

SELECT @CETList = COALESCE(@CETList + ',', '') + CAST(CETL.[TypeID] AS varchar)
FROM CaseEventTypeList CETL 
WHERE CETL.RefID = 1

PRINT @CETList

,并提供:

2,3,6

现在我需要扩展它以获取整个表格。这就是我想出的:

UPDATE @CaseSites SET Method = COALESCE(Method + ',','') + CAST(CETL.TypeID AS VARCHAR)
 FROM CaseEvents CE
   JOIN CaseEventTypeList AS CETL ON CETL.RefID = CE.TypeListID
 WHERE BriefID = CE.CaseID

但是,这只会使用每组值中的第一个值填充Method。

looked online and found this但宁愿不使用udf - 特别是当解决方案感觉如此接近时。

UPDATE:数据非常简单,每种情况下RefId都会递增,TypeID可以是任意数字,但目前只建模1到8。因此你可能有:

RefID TypeID
12  2
12  7
13  1
14  1
14  3
14  6

这有望建模为

SELECT Method from @CaseSites
Method 
...
12  2,7
13  1
14  1,3,6
...

2 个答案:

答案 0 :(得分:1)

我认为您的问题是因为更新规则每行仅评估一次“SET Method =”,因此您只能在列表中获得一个值。

UDF将是一种简单的方法,但由于您使用临时表,这可能不是一个选项,您仍然希望避免使用它们。因此,您可能需要使用游标(不是很好),但可以按照您想要的方式完成工作。

这是我根据你原来的sql提出的。

DECLARE myCURSOR Cursor
FOR
  Select BriefID
  from #CaseSites

Open myCursor
DECLARE @BriefID int
DECLARE @CETList varchar(30)
Fetch NEXT FROM myCursor INTO @BriefID
While (@@FETCH_STATUS <> -1)
BEGIN
  IF (@@FETCH_STATUS <> -2)

  SET @CETList = ''
  SELECT @CETList = COALESCE(@CETList + ',', '') + CAST(CETL.[TypeID] AS varchar)
    FROM #CaseEventTypeList CETL 
   WHERE CETL.RefID = @BriefID 

  UPDATE #CaseSites
     SET Method = @CETList
   WHERE BriefID = @BriefID

  Fetch NEXT FROM myCursor INTO @BriefID
END
CLOSE myCursor
DEALLOCATE myCursor 

答案 1 :(得分:0)

如果您使用xml,我找到了比我第一个更好的答案: 使用xml的相关子查询。

UPDATE #CaseSites 
   SET Method = (   
                  select  cast([TypeID] as varchar(30))+ ',' 
                    from #CaseEventTypeList
                   where RefID = CE.CaseID 
                     for xml path ('') 
                )
  FROM #CaseEvents CE