从不同的表中插入两列

时间:2013-03-10 11:48:56

标签: sql-server database sql-insert

我需要编写一个插入查询,使用来自不同表的数据将一些行插入到表中。我有:

  • 变量@ID,其中包含表中新插入行的ID。 (1)
  • 表(2)包含一些ID s
  • 表(3)定义了上述两个表之间的关系。

现在我需要为(2)中的每个ID插入表格(3)中的新行。

因此,如果@ID=2和ID = 1, 2, 3, 4, 5, 6,我想在表(3)中插入以下行:

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

1 个答案:

答案 0 :(得分:0)

假设值6并不意味着被丢弃(如果是,请解释逻辑)。还假设您只想将表2中的每一行插入表2中。

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

如果ID列表实际上是CSV ,则:

首先创建一个Split函数(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