如何使用 SQL Server 中的存储过程在单个查询中插入多行

Posted

技术标签:

【中文标题】如何使用 SQL Server 中的存储过程在单个查询中插入多行【英文标题】:How to insert multiple rows in a single query using a stored procedure in SQL Server 【发布时间】:2018-05-17 03:16:39 【问题描述】:
CREATE PROCEDURE Usp_insertgender
    (@gendervalues VARCHAR(MAX))
AS
BEGIN
    INSERT INTO sparsha.dbo.Genders ([GenderName])
    VALUES @gendervalues;
END

我尝试了上述过程,但出现错误

消息 102,级别 15,状态 1,过程 Usp_insertgender,第 10 行 “@gendervalues”附近的语法不正确。

我将 @gendervalues 值传递为 ('1'),('2')

【问题讨论】:

【参考方案1】:

可能最简单的方法是定义TVP:

CREATE TYPE myTVPType AS TABLE( v VARCHAR(50));  
GO  

CREATE PROCEDURE Usp_insertgender (@gendervalues myTVPType READONLY) 
AS 
BEGIN
  INSERT INTO sparsha.dbo.Genders ([GenderName]) 
  SELECT v
  FROM @gendervalues; 
END;

如何称呼它:

DECLARE @tvp AS myTVPType;  

INSERT INTO @TVP (v)  
VALUES ('1'),('2');

EXEC Usp_insertgender @TVP;  
GO  

【讨论】:

当执行过程出错时执行 Usp_insertgender (1),(2) '1' 附近的语法不正确。 hi lad2025 感谢您为如何调用程序提供解决方案。请通过将参数指定为 ('1'),('2') 并插入多个值来解决如何在存储过程中调用它。这里的问题是上面的插入取决于另一个插入查询。 by giving parameter as ('1'),('2') 我看到的唯一方法是动态 SQL,但在这里展示它将是巨大的反模式。【参考方案2】:

试试这个:(使用动态 SQL)

CREATE PROCEDURE Usp_insertgender
    (@gendervalues VARCHAR(MAX))
AS
BEGIN
    DECLARE @sql nvarchar(2000)

    SET @sql = N'INSERT INTO sparsha.dbo.Genders ([GenderName])
    VALUES ' + @gendervalues

    EXEC sp_executesql @sql
END

【讨论】:

@guna:您好,您收到了两个很好的答案。请接受其中之一

以上是关于如何使用 SQL Server 中的存储过程在单个查询中插入多行的主要内容,如果未能解决你的问题,请参考以下文章

如何为每次执行将过程结果存储在 SQL Server 中的新(单个)文本文件中

SQL Server——存储过程

SQL Server T—SQL 存储过程 触发器

我应该如何使用 sql server 中的存储过程将列名存储在变量中?

SQL server学习——T-SQL编程之存储过程

如何在sql server中创建一个存储过程中的varchar型的输入参数默认值为空