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

Sql 插入作为输入接收的值列表,sql,sql-server-2008,tsql,Sql,Sql Server 2008,Tsql,因此,我有一个查询,需要从外部应用程序获取输入,并使用这些值插入到表变量中 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,9

因此,我有一个查询,需要从外部应用程序获取输入,并使用这些值插入到表变量中

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等中,您可以直接将数据表作为参数传递,因此您不必担心所有这些转置

如果您不能处理这个问题,那么创建一个拆分函数

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

搜索SO或google,了解如何将字符串拆分为列表临时表、表变量,然后您将能够从这些表中插入/选择列表4,55、,。。。来自?一个允许用户选择特殊值的报告应用程序。我根本无法修改它给我的字符串。这些值是完全任意的,但它们只有在运行时才知道。它们之间是否有共同的分隔符。也许你可以把它放到一个循环中,然后把它们解析到一个临时表中。谢谢!文本分割函数方法看起来正是我所需要的。
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', ',');