0

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

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

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

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

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

1 回答 1

0

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

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

如果 ID 列表确实是 CSV,则:

首先创建一个拆分函数(这里描述了几个替代方法,除了它们输出字符串而不是整数),例如

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 或其他集合),您可以使用表值参数并避免拆分的需要。

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的 asSqlDbType.Structured而不是将您的 CSV 作为字符串传递。更多信息在这里:

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

于 2013-03-10T13:12:14.487 回答