MSSQL过程插入多个值而不是一个值

时间:2016-03-31 12:52:47

标签: sql sql-server

我有这个MSSQL程序:

CREATE PROCEDURE InsertCodeIfNotExist
    @Code nvarchar(32)
AS
  INSERT Codes (Code)
  SELECT @Code
  WHERE NOT EXISTS
          (SELECT 1
            FROM Codes
            WHERE Code = @Code
          );

这对我来说效果很好,但如果我能像100个值一样工作,我会更好,并为每个值调用此过程。用mssql可以吗?我可以定义为InsertManyCodesIfNotExist并在那里循环数百个值吗?

2 个答案:

答案 0 :(得分:3)

是的,你可以通过几种不同的方式轻松地做到这一点。我处理这种情况的一种方法是创建用户定义的数据类型,例如我在下面使用的数据类型:

CREATE TYPE [dbo].[ModuleList] AS TABLE(
    [SubId] [varchar](12) NOT NULL,
    PRIMARY KEY CLUSTERED 
(
    [SubId] ASC
)WITH (IGNORE_DUP_KEY = OFF)
)

在您的情况下,替换'代码'对于SubId。然后你可以在T-SQL中创建这个类型,用代码填充它并将它作为参数传递给你的存储过程。

您的存储过程将设置为采用此参数,如下所示:

CREATE PROCEDURE [dbo].[SomeStoredProc]
    @ModuleList ModuleList READONLY
AS
...

那时你可以像对待表一样对待@ModuleList。在您的情况下,一个代码表。

答案 1 :(得分:0)

是的,您可以定义表值参数并将表传递给存储过程:

/* Create a table type. */ 
CREATE TYPE CodeTableType AS TABLE ( Code VARCHAR(32)); 
GO 

/* Create a procedure to receive data for the table-valued parameter. */ 
CREATE PROCEDURE dbo.InsertCodeIfNotExist
@TVP CodeTableType READONLY 
AS 
SET NOCOUNT ON 
INSERT INTO Codes (Code) 
SELECT 
    Code
FROM  
    @TVP; 

您可以在此处找到详细信息: https://msdn.microsoft.com/en-us/library/bb510489(v=sql.120).aspx