我有这个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
并在那里循环数百个值吗?
答案 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