将连接的字符串插入 table 的存储过程
Stored procedure to insert concatenated string into table
我有两个 table,ParentPayor
和 ChildPayor
。
ParentID
是 ParentPayor
中的主键,ParentID
是 ChildPayor
table 中的外键。 ChildPayor
table 有一列 State
.
我想创建一个存储过程,连接 ChildPayor
table 中的每个 State
,并将字符串插入 ParentPayor
列 States
, 其中 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
我有两个 table,ParentPayor
和 ChildPayor
。
ParentID
是 ParentPayor
中的主键,ParentID
是 ChildPayor
table 中的外键。 ChildPayor
table 有一列 State
.
我想创建一个存储过程,连接 ChildPayor
table 中的每个 State
,并将字符串插入 ParentPayor
列 States
, 其中 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