0

複数のレコード (~250) をテーブル (MyTable など) に挿入しようとしていますが、まだ存在しない場合にのみ新しい行を挿入したいと考えています。

私は SQL Server 2008 R2 を使用しており、SQL conditional insert if row does not already existなどの他のスレッドから助けを得ました。

次の削除されたスクリプトでそれを達成できますが、挿入されたすべての行に対してこのチェックを繰り返す必要があるため、これを行うためのより良い (短い) 方法があるかどうかを知りたいです。このスクリプトは、DB のデプロイ中に 1 回実行するだけなので、パフォーマンスについてはあまり心配していません。

INSERT INTO MyTable([Description], [CreatedDate], [CreatedBy], [ModifiedDate], [ModifiedBy], [IsActive], [IsDeleted]) 

SELECT N'ababab', GETDATE(), 1, NULL, NULL, 1, 0
WHERE NOT EXISTS(SELECT * FROM MyTable WITH (ROWLOCK, HOLDLOCK, UPDLOCK)
   WHERE
      ([InstanceId] IS NULL OR  [InstanceId] = 1)
      AND [ChannelPartnerId] IS NULL
      AND [CreatedBy] = 1) 
UNION ALL

SELECT N'xyz', 1, GETDATE(), 1, NULL, NULL, 1, 0 
WHERE NOT EXISTS(SELECT * FROM [dbo].[TemplateQualifierCategoryMyTest] WITH (ROWLOCK, HOLDLOCK, UPDLOCK)
   WHERE
      ([InstanceId] IS NULL OR  [InstanceId] = 1)
      AND [ChannelPartnerId] IS NULL
      AND [CreatedBy] = 1)

-- More SELECT statements goes here
4

1 に答える 1

0

説明を使用して一時テーブルを作成し、それらすべてを選択して MyTable に挿入することができます。これは、宛先にまだ存在していない一時テーブルの行をチェックします (このトリックは、LEFT OUTER JOIN と組み合わせて実装されます) WHERE 句の MyTable.Description 部分に IS NULL を使用):

DECLARE @Descriptions TABLE ([Description] VARCHAR(200) NOT NULL )

INSERT INTO @Descriptions ( Description )VALUES  ( 'ababab' )
INSERT INTO @Descriptions ( Description )VALUES  ( 'xyz' )

INSERT INTO dbo.MyTable
        ( Description ,
          CreatedDate ,
          CreatedBy ,
          ModifiedDate ,
          ModifiedBy ,
          IsActive ,
          IsDeleted
        )

SELECT d.Description, GETDATE(), 1, NULL, NULL, 1, 0
FROM @Descriptions d
LEFT OUTER JOIN dbo.MyTable mt ON d.Description = mt.Description
WHERE mt.Description IS NULL
于 2013-03-22T09:25:47.167 に答える