テーブルにデータを挿入したいのですが、データベースにまだ存在しないデータのみを挿入します。
これが私のコードです:
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トランザクションでラップしてもこれが解決されない理由についての適切な回答。