簡體   English   中英

插入作為輸入接收的值的列表

[英]INSERTing a list of values received as input

因此,我有一個查詢,需要從外部應用程序獲取輸入並使用這些值將其插入表變量中。

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', ',');

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM