0

異なるテーブルのデータを使用してテーブルにいくつかの行を挿入する挿入クエリを作成する必要があります。私は持っています:

  • @IDテーブルに新しく挿入された行のIDを含む変数。(1)
  • 表(2)にはいくつかIDのが含まれています
  • 表(3)は、上記の2つの表の間の関係を定義します。

ID次に、(2)のそれぞれにテーブル(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
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である場合、次のようになります。

最初にSplit関数を作成します(整数の代わりに文字列を出力することを除いて、ここで説明するいくつかの選択肢)。

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

次に、CSVを文字列として渡すのではなくDataTable、として渡すようにC#コードを変更する必要があります。SqlDbType.Structured詳細はこちら:

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

于 2013-03-10T13:12:14.487 に答える