2013-03-10 87 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

相关问题