将数据写入多张表的单行

时间:2018-11-02 09:49:14

标签: sql sql-server

我有一个带有错误编号的表和一个用于存储错误的参考。我需要在一行中编写错误,我得到了以下选项,但这取决于表中记录的顺序。

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);

enter image description here

DECLARE @DictErrors TABLE (
    ErrorId         INT
    ,[Description]  NVARCHAR(4000)
);


INSERT  @DictErrors (ErrorId
                    ,[Description])
VALUES (3, N'Not found')
    ,(4, N'Disconnect')
    ,(5, N'Exception');

enter image description here

工作结果:

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;

enter image description here

我希望看到添加了两个具有FileId = 0的条目和一个“找不到”错误,以及三个具有File Id = 10的条目,以及两个“断开连接;异常”错误。

1 个答案:

答案 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