2013-07-29 66 views
1

所以我有一個查詢需要從外部應用程序獲取輸入並使用這些值插入到表變量中。插入作爲輸入接收到的值列表

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

允許用戶選擇專門值的報告應用程序。我無法修改它給我的字符串。這些值完全是任意的,但只在運行時才知道。 –

回答

2

如果列表是從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

謝謝!文本分割函數方法看起來正是我所需要的。 –