我有一个带有错误编号的表和一个用于存储错误的参考。我需要在一行中编写错误,我得到了以下选项,但这取决于表中记录的顺序。
DECLARE @Errors TABLE (
RowNumber INT
,ErrorId INT
,ErrorDescription NVARCHAR(4000)
,FileId INT
);
INSERT @Errors (RowNumber
,ErrorId
,ErrorDescription
,FileId)
VALUES (1, 3, N'', 0)
,(2, 3, N'', 0)
,(2, 4, N'', 10)
,(2, 5, N'', 10)
,(1, 4, N'', 10)
,(1, 5, N'', 10)
,(3, 4, N'', 10)
,(3, 5, N'', 10);
DECLARE @DictErrors TABLE (
ErrorId INT
,[Description] NVARCHAR(4000)
);
INSERT @DictErrors (ErrorId
,[Description])
VALUES (3, N'Not found')
,(4, N'Disconnect')
,(5, N'Exception');
工作结果:
DECLARE @Description NVARCHAR(4000) = N'';
DECLARE @PreviousRow INT = 0;
UPDATE err
SET @Description = CASE
WHEN @PreviousRow = err.RowNumber
THEN @Description + dvr.[Description] + '; '
ELSE dvr.[Description] + '; '
END
,err.ErrorDescription = @Description
,@PreviousRow = err.RowNumber
FROM @Errors AS err
INNER JOIN @DictErrors AS dvr
ON err.ErrorId = dvr.ErrorId;
我希望看到添加了两个具有FileId = 0的条目和一个“找不到”错误,以及三个具有File Id = 10的条目,以及两个“断开连接;异常”错误。
答案 0 :(得分:1)
您可以在下面使用STUFF()函数尝试
with cte1 as
(
select a.*,b.description from Errors a inner join DictErrors b on a.errorid=b.errorid
)
UPDATE err SET @Description=names
from @Errors err join
(
select rownumber,names= STUFF((
SELECT ', ' + Description FROM cte1 b
WHERE a.rownumber = b.rownumber
FOR XML PATH('')), 1, 1, '')
from cte1 a
group by rownumber
)X on err.rownumber=X.rownumber