SQL Server 存在しない場合は挿入する 質問する

SQL Server 存在しない場合は挿入する 質問する

テーブルにデータを挿入したいのですが、データベースにまだ存在しないデータのみを挿入します。

これが私のコードです:

ALTER PROCEDURE [dbo].[EmailsRecebidosInsert]
  (@_DE nvarchar(50),
   @_ASSUNTO nvarchar(50),
   @_DATA nvarchar(30) )
AS
BEGIN
   INSERT INTO EmailsRecebidos (De, Assunto, Data)
   VALUES (@_DE, @_ASSUNTO, @_DATA)
   WHERE NOT EXISTS ( SELECT * FROM EmailsRecebidos 
                   WHERE De = @_DE
                   AND Assunto = @_ASSUNTO
                   AND Data = @_DATA);
END

エラーは次のとおりです:

メッセージ 156、レベル 15、状態 1、プロシージャ EmailsRecebidosInsert、行 11
キーワード 'WHERE' 付近の構文が正しくありません。

ベストアンサー1

以下のコードの代わりに

BEGIN
   INSERT INTO EmailsRecebidos (De, Assunto, Data)
   VALUES (@_DE, @_ASSUNTO, @_DATA)
   WHERE NOT EXISTS ( SELECT * FROM EmailsRecebidos 
                   WHERE De = @_DE
                   AND Assunto = @_ASSUNTO
                   AND Data = @_DATA);
END

と置換する

BEGIN
   IF NOT EXISTS (SELECT * FROM EmailsRecebidos 
                   WHERE De = @_DE
                   AND Assunto = @_ASSUNTO
                   AND Data = @_DATA)
   BEGIN
       INSERT INTO EmailsRecebidos (De, Assunto, Data)
       VALUES (@_DE, @_ASSUNTO, @_DATA)
   END
END

更新: (指摘してくれた @Marc Durdin に感謝します)

高負荷の場合、最初の接続がINSERTを実行する前に2番目の接続がIF NOT EXISTSテストに合格する可能性があるため、競合状態が発生し、これが失敗することがあります。出典: stackoverflow.com/a/3791506/1836776トランザクションでラップしてもこれが解決されない理由についての適切な回答。

おすすめ記事