You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SQL Server存储过程:将逗号分隔ProductId批量插入UserProduct表

当然可以实现!

在SQL Server中处理这种「单个用户ID + 逗号分隔的产品ID列表」的批量插入需求是非常常见的场景,下面给你一套完整的实现方案:

核心思路

利用SQL Server内置的STRING_SPLIT函数(SQL Server 2016及以上版本支持)将逗号分隔的ProductIds字符串拆分成独立行,再结合传入的UserId批量插入到UserProduct表中。如果你的SQL Server版本低于2016,也可以用自定义字符串拆分函数替代,后面会补充兼容方案。

完整存储过程代码

CREATE PROCEDURE InsertUserProducts
    @UserId INT,
    @ProductIds NVARCHAR(MAX)
AS
BEGIN
    SET NOCOUNT ON;

    -- 第一步:校验参数合法性,避免无效输入导致异常
    IF @UserId IS NULL
    BEGIN
        RAISERROR('UserId参数不能为空', 16, 1);
        RETURN;
    END

    IF @ProductIds IS NULL OR LTRIM(RTRIM(@ProductIds)) = ''
    BEGIN
        RAISERROR('ProductIds参数不能为空', 16, 1);
        RETURN;
    END

    -- 第二步:拆分字符串并批量插入数据
    INSERT INTO UserProduct (UserId, ProductId)
    SELECT 
        @UserId AS UserId,
        CAST(value AS INT) AS ProductId
    FROM STRING_SPLIT(@ProductIds, ',')
    -- 额外校验:确保拆分出来的是有效整数,避免插入非法值
    WHERE ISNUMERIC(value) = 1;

    -- 可选:如果需要避免同一用户重复插入相同ProductId,改用下面的INSERT语句
    /*
    INSERT INTO UserProduct (UserId, ProductId)
    SELECT 
        @UserId AS UserId,
        CAST(value AS INT) AS ProductId
    FROM STRING_SPLIT(@ProductIds, ',')
    WHERE ISNUMERIC(value) = 1
    AND NOT EXISTS (
        SELECT 1 
        FROM UserProduct 
        WHERE UserId = @UserId AND ProductId = CAST(value AS INT)
    );
    */
END

如何调用存储过程

比如要插入用户817对应的产品7、5、33,以及用户798对应的产品6、12,执行以下命令即可:

EXEC InsertUserProducts @UserId = 817, @ProductIds = '7,5,33';
EXEC InsertUserProducts @UserId = 798, @ProductIds = '6,12';

执行完成后,查询UserProduct表就能得到你想要的结果集:

UserId ProductId

817 7
817 5
817 33
798 6
798 12
...

低版本SQL Server兼容方案(<2016)

如果你的SQL Server版本不支持STRING_SPLIT,可以自定义一个字符串拆分函数,比如用XML解析的方式:

CREATE FUNCTION dbo.SplitString
(
    @InputString NVARCHAR(MAX),
    @Delimiter NVARCHAR(5)
)
RETURNS @OutputTable TABLE (Value NVARCHAR(MAX))
AS
BEGIN
    DECLARE @XmlData XML
    SET @XmlData = CAST('<root><item>' + REPLACE(@InputString, @Delimiter, '</item><item>') + '</item></root>' AS XML)

    INSERT INTO @OutputTable(Value)
    SELECT T.c.value('.', 'NVARCHAR(MAX)')
    FROM @XmlData.nodes('/root/item') T(c)

    RETURN
END

然后在存储过程中把STRING_SPLIT替换成dbo.SplitString即可正常使用。

内容的提问来源于stack exchange,提问作者K.Paul

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 06:57:29