将连接的字符串插入 table 的存储过程

Stored procedure to insert concatenated string into table

我有两个 table,ParentPayorChildPayor

ParentIDParentPayor 中的主键,ParentIDChildPayor table 中的外键。 ChildPayor table 有一列 State.

我想创建一个存储过程,连接 ChildPayor table 中的每个 State,并将字符串插入 ParentPayorStates, 其中 ChildPayor.ParentID = ParentPayor.ParentID.

我刚刚发现 STRING_AGG 连接:

    STRING_AGG (State, ',') 
FROM ChildPayors AS States 
WHERE ParentPayorID = 32

但我希望能够连接 ChildPayor 中的所有 State,并插入到 ParentID 匹配的 ParentPayor 中。这有意义吗?

类似于(我知道这是不正确的):

SELECT STRING_AGG (State, ',') 
FROM ChildPayors, ParentPayors AS States 
WHERE ParentPayors.ParentPayorID = ChildPayors.ParentPayorID

INSERT INTO ParentPayors(States) 
VALUES (States)

我会经常使用CROSS APPLY来计算中间值。尝试类似的东西:

DECLARE @ParentPayor TABLE (ParentID INT, ParentName VARCHAR(100), States VARCHAR(1000))
INSERT @ParentPayor
VALUES
    (1, 'AAA', null),
    (2, 'BBB', null),
    (3, 'CCC', null),
    (4, 'DDD', null)

DECLARE @ChildPayor TABLE (ChildID INT, ParentID INT, StateName VARCHAR(100))
INSERT @ChildPayor
VALUES
    (1, 1, 'New York'),
    (2, 2, 'Texas'),
    (3, 2, 'Virginia'),
    (4, 2, 'California'),
    (5, 4, 'Virginia'),
    (6, 4, 'New York')

UPDATE P
SET States = S.States
FROM @ParentPayor P
CROSS APPLY (
    SELECT States = STRING_AGG(C.StateName, ', ') WITHIN GROUP(ORDER BY C.StateName)
    FROM @ChildPayor C
    WHERE C.ParentID = P.ParentID
) S

SELECT *
FROM @ParentPayor P

输出:

ParentID ParentName States
1 AAA New York
2 BBB California, Texas, Virginia
3 CCC (null)
4 DDD New York, Virginia

上面的 UPDATE 语句将成为存储过程的主体。

进一步思考,也可以使用子选择。可以使用以下 JOIN 代替 CROSS APPLY:

LEFT JOIN (
    SELECT C.ParentID, States = STRING_AGG(C.StateName, ', ') WITHIN GROUP(ORDER BY C.StateName)
    FROM @ChildPayor C
    GROUP BY C.ParentID
) S ON S.ParentID = P.ParentID