插入作为输入接收到的值列表

问题描述:

所以我有一个查询需要从外部应用程序获取输入并使用这些值插入到表变量中。插入作为输入接收到的值列表

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) 

还是有?最后,我只需要将这个值列表放到一个表中,以便我可以对它们执行操作。

+0

搜索SO(或谷歌)有关如何将字符串分割成表(临时表,表变量),然后您就可以插入/从这样的选择表 –

+1

这份名单中的'4,55,...'从哪里来? –

+0

允许用户选择专门值的报告应用程序。我无法修改它给我的字符串。这些值完全是任意的,但只在运行时才知道。 –

如果列表是从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', ','); 
+0

谢谢!文本分割函数方法看起来正是我所需要的。 –