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

Posted

技术标签:

【中文标题】将连接字符串插入表的存储过程【英文标题】:Stored procedure to insert concatenated string into table 【发布时间】:2022-01-13 20:02:13 【问题描述】:

我有两张桌子,ParentPayorChildPayor

ParentIDParentPayor 中的主键,ParentIDChildPayor 表中的外键。 ChildPayor 表有一个列 State

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

我刚刚发现STRING_AGG 可以连接:

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

但我希望能够连接ChildPayor 中的所有States,并插入ParentPayor 匹配ParentIDs 的位置。这有意义吗?

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

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 ANSI JOIN 语法-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,下次插入数据时能不插入主键列吗

SQL语句中两个表的连接

我可以在 prepare() 函数中连接字符串以插入指定的表吗

表连接Tsql基本编程和存储过程