我有一个名为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
...
答案 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