2013-03-10 143 views
0

我需要編寫一個插入查詢以使用來自不同表格的數據將一些行插入表格。我有:插入來自不同表格的兩列

  • 變量@ID其中包含新插入的行在表中的ID。 (1)
  • 表(2)包含一些ID s
  • 表(3)定義了上述兩個表之間的關係。

現在我需要在表(3)的(2)中爲每個ID插入一個新行。

所以,如果@ID=2和ID = 1, 2, 3, 4, 5, 6,我要插入表下面的行(3):

table1_ID table2_ID 
--------- --------- 
1   1 
1   2 
1   3 
1   4 
1   5 
+0

什麼版本的SQL Server?這個「ID」列表是如何構建的,以及在哪裏?爲什麼值'6'被丟棄? – 2013-03-10 13:01:39

+0

或者如果「list」實際上只是來自'table2'的一個集合,那麼您是如何確定這5個(或6?)值屬於'ID = 1'?這只是表中的每一行嗎?請更好地描述這種關係。 – 2013-03-10 13:22:49

回答

0

假設值6並不意味着被丟棄(如果是,請解釋邏輯)。同時假設你只是想在表2中的每一行插入表2

INSERT dbo.Table3(table1_ID, table2_ID) 
    SELECT @ID, ID 
    FROM dbo.Table2 
    -- WHERE ID <> 6??? 
    ; 

如果ID列表確實是一個CSV,則:

首先創建一個分割功能( several alternatives described here, except they output strings instead of integers),例如現在

CREATE FUNCTION dbo.SplitInts 
(
    @List  VARCHAR(MAX), 
    @Delimiter VARCHAR(255) 
) 
RETURNS @t TABLE(Item INT) 
AS 
BEGIN 
    INSERT @t(Item) SELECT CONVERT(INT, SUBSTRING(@List, Number, 
     CHARINDEX(@Delimiter, @List + @Delimiter, Number) - Number)) 
    FROM (SELECT ROW_NUMBER() OVER (ORDER BY [object_id]) 
     FROM sys.all_objects) AS n(Number) 
    WHERE Number <= CONVERT(INT, LEN(@List)) 
     AND SUBSTRING(@Delimiter + @List, Number, 1) = @Delimiter; 

    RETURN; 
END 
GO 

存儲過程可以簡單地說:

CREATE PROCEDURE dbo.whatever 
    @ID INT, 
    @IDs VARCHAR(MAX) 
AS 
BEGIN 
    SET NOCOUNT ON; 

    INSERT dbo.Table3(table1_ID, table2_ID) 
    SELECT @ID, Item 
     FROM dbo.SplitInts(@IDs, ','); 
END 
GO 

然而,如果你的SQL Server 2008或以上,並以逗號分隔ID的這個名單是從你的應用程序來(例如,從DataTable或其他設置),您可以使用Table-Valued Parameter並避免分割。

CREATE TYPE dbo.SetOfIntegers 
(Number INT); 
GO 

CREATE PROCEDURE dbo.whatever 
    @ID INT, 
    @IDs dbo.SetOfIntegers READONLY 
AS 
BEGIN 
    SET NOCOUNT ON; 

    INSERT dbo.Table3(table1_ID, table2_ID) 
    SELECT @ID, Item 
     FROM @IDs; 
END 
GO 

然後,你必須改變的C#代碼通過您的DataTable作爲SqlDbType.Structured,而不是通過你的CSV作爲一個字符串。更多的信息在這裏:

http://www.sqlperformance.com/2012/08/t-sql-queries/splitting-strings-now-with-less-t-sql

+0

非常感謝Aaron的幫助!現在它工作正常。 – ManS 2013-03-10 13:32:37

相關問題