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

如何在存储过程中接收多值参数并生成多行数据?

实现支持多班级ID批量插入的SQL存储过程

方案一:使用表值参数(推荐,类型安全)

表值参数是SQL Server处理多值输入的标准方式,能确保参数类型安全,避免字符串分割的潜在问题。

1. 创建用户定义表类型

先定义用于接收多个班级ID的表类型:

CREATE TYPE dbo.ClassIdList AS TABLE (ClassId INT);

2. 创建存储过程

修改参数为表值类型,通过INSERT...SELECT批量插入数据:

CREATE PROCEDURE dbo.InsertStudentClasses
    @studentName NVARCHAR(255),
    @classIds dbo.ClassIdList READONLY
AS
BEGIN
    SET NOCOUNT ON;

    -- 批量插入每个班级对应的学生记录
    INSERT INTO studentClass (classId, studentName)
    SELECT ClassId, @studentName
    FROM @classIds;

    -- 返回插入后的全表数据(可选,按需调整)
    SELECT classId, studentName FROM studentClass;
END

3. 执行存储过程

声明表变量并传入多个班级ID:

DECLARE @classList dbo.ClassIdList;
INSERT INTO @classList VALUES (1), (3);

EXEC dbo.InsertStudentClasses
    @studentName = 'Jane Doe',
    @classIds = @classList;

方案二:使用字符串分割(兼容旧版SQL Server)

若SQL Server版本≥2016,可直接用内置STRING_SPLIT函数;版本更低则需自定义分割函数,以下是内置函数的实现方式:

1. 创建存储过程

CREATE PROCEDURE dbo.InsertStudentClasses_StringSplit
    @studentName NVARCHAR(255),
    @classId NVARCHAR(MAX) -- 传入逗号分隔的班级ID字符串,如'1,3'
AS
BEGIN
    SET NOCOUNT ON;

    -- 分割字符串并过滤无效ID后插入
    INSERT INTO studentClass (classId, studentName)
    SELECT CAST(value AS INT), @studentName
    FROM STRING_SPLIT(@classId, ',')
    WHERE TRY_CAST(value AS INT) IS NOT NULL;

    -- 返回插入后的全表数据
    SELECT classId, studentName FROM studentClass;
END

2. 执行存储过程

EXEC dbo.InsertStudentClasses_StringSplit
    @studentName = 'Jane Doe',
    @classId = '1,3';

执行结果验证

执行后studentClass表数据将符合预期:

classId | studentName
--------+------------
   1    | John Doe
   2    | John Doe
   1    | Jane Doe
   3    | Jane Doe

内容的提问来源于stack exchange,提问作者ER_27

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 06:45:33