所以我有一个查询需要从外部应用程序获取输入并使用这些值插入到表变量中。
DECLARE @prompt TABLE(
answerID int,
rowid int NOT NULL IDENTITY(1,1) primary key
);
INSERT INTO @HELLO (answerid)
SELECT (x,y,z)
问题是,当接收到输入时,它会以列表形式出现,如下所示:
INSERT INTO @HELLO (answerid)
SELECT (4,55,66,88,978)
这是不正确的语法。该列表明确以 x、y、z 的形式出现,因此我实际上没有办法对数据进行处理,例如:
INSERT INTO #blah
VALUES (x), (y), (z)
或者有吗?最后,我只需要把这个值列表放入一个表中,这样我就可以对它们执行工作。
最佳答案
如果列表是从 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 作为参数传递,因此您不必担心所有这些转置。
如果您无法处理这个问题,请创建一个 Split 函数。
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', ',');
关于sql - INSERTing 作为输入接收的值列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17932953/