将连接字符串插入表的存储过程
Posted
技术标签:
【中文标题】将连接字符串插入表的存储过程【英文标题】:Stored procedure to insert concatenated string into table 【发布时间】:2022-01-13 20:02:13 【问题描述】:我有两张桌子,ParentPayor
和 ChildPayor
。
ParentID
是 ParentPayor
中的主键,ParentID
是 ChildPayor
表中的外键。 ChildPayor
表有一个列 State
。
我想创建一个存储过程,将ChildPayor
表中的每个State
连接起来,并将字符串插入ParentPayor
列States
,其中ChildPayor.ParentID = ParentPayor.ParentID
。
我刚刚发现STRING_AGG
可以连接:
STRING_AGG (State, ',')
FROM ChildPayors AS States
WHERE ParentPayorID = 32
但我希望能够连接ChildPayor
中的所有State
s,并插入ParentPayor
匹配ParentID
s 的位置。这有意义吗?
类似的东西(我知道这是不正确的):
SELECT STRING_AGG (State, ',')
FROM ChildPayors, ParentPayors AS States
WHERE ParentPayors.ParentPayorID = ChildPayors.ParentPayorID
INSERT INTO ParentPayors(States)
VALUES (States)
【问题讨论】:
请按照Minimal, Reproducible Example提供样本数据和预期结果 保持数据库规范化并将其仅保留在一个表中似乎更明智。当您需要信息时,只需查询它,也许使用视图 Bad habits to kick : using old-style JOINs - 旧式 逗号分隔的表格列表 样式已替换为 ANSI 中的 proper ANSIJOIN
语法-92 SQL 标准(近 30 年前),不鼓励使用它
【参考方案1】:
我会经常使用 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
【讨论】:
以上是关于将连接字符串插入表的存储过程的主要内容,如果未能解决你的问题,请参考以下文章
一个c#窗体 ,我已经实现了数据库连接功能,但是插入信息有问题,帮帮写下,QQ277476075 100分
sQL数据库表的主键列设为标识,增量为1,下次插入数据时能不插入主键列吗