如果列表是从 C# 等传入的,并且来自集合(例如 DataTable),那么处理此列表的最有效方法是使用表值参数。首先,创建一个表类型:
CREATE TYPE dbo.MyList(ID INT PRIMARY KEY);
现在,创建一个接受此类型作为参数的存储过程:
CREATE PROCEDURE dbo.MyProcedure
@List dbo.MyList READONLY
AS
BEGIN
SET NOCOUNT ON;
DECLARE @prompt TABLE
(
answerID INT,
[rowid] INT NOT NULL IDENTITY(1,1) PRIMARY KEY
);
INSERT INTO @HELLO (answerid)
SELECT ID FROM @List;
...
END
GO
来自 T-SQL 的示例用法:
DECLARE @List dbo.MyList;
INSERT @List VALUES(4),(55),(66),(88),(978);
EXEC dbo.MyProcedure @List = @List;
从 C# 等中,您可以直接将 DataTable 作为参数传递,因此您不必担心所有这些转置。
如果你不能处理,那么创建一个拆分函数。
CREATE FUNCTION dbo.SplitInts
(
@List VARCHAR(MAX),
@Delimiter VARCHAR(255) = ','
)
RETURNS TABLE
WITH SCHEMABINDING
AS
RETURN
(
SELECT Item = y.i.value('(./text())[1]', 'int')
FROM
(
SELECT x = CONVERT(XML, '<i>'
+ REPLACE(@List, @Delimiter, '</i><i>')
+ '</i>').query('.')
) AS a CROSS APPLY x.nodes('i') AS y(i)
);
GO
现在你可以说:
DECLARE @prompt TABLE
(
answerID INT,
[rowid] INT NOT NULL IDENTITY(1,1) PRIMARY KEY
);
INSERT @prompt(answerID)
SELECT Item FROM dbo.SplitInts('4,55,66,88,978', ',');