sql - INSERTing 作为输入接收的值列表

标签 sql sql-server-2008 t-sql

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

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/

相关文章:

MySQL:创建触发器时出现语法错误

JAVA SQL 将所有通配符分配为 null

sql-server - 批量删除数据 - Azure SQL Server

sql - 从sql中的点数据库中获取路径

sql - 使用存储过程借方贷方

entity-framework - 为什么数据库恢复后EF要创建索引?

sql - 检索一组的随机行

sql - 在 SQL Server 的查询中插入数据

sql-server - T-SQL MDQ.RegexReplace 嵌套

sql-server - 按公共(public)列分组的多个表中的值求和