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
相关产品推荐
相关产品推荐

