SQL Server 如果不存在则插入

标签 sql sql-server sql-server-2008 stored-procedures sql-insert

我想将数据插入到表中,但仅插入数据库中尚不存在的数据。

这是我的代码:

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

错误是:

Msg 156, Level 15, State 1, Procedure EmailsRecebidosInsert, Line 11
Incorrect syntax near the keyword 'WHERE'.

最佳答案

而不是下面的代码

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 之前通过 IF NOT EXISTS 测试,即竞争条件。请参阅stackoverflow.com/a/3791506/1836776关于为什么即使包装在交易中也不能解决这个问题的一个很好的答案。

关于SQL Server 如果不存在则插入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20971680/

相关文章:

mysql - 查询从具有添加约束的单个列中获取不同的对

mysql - 如何仅显示结果表的多个最大值?

sql - RAISERROR() 的语法含义是什么

mysql - mssql 到 mysql 转换工具

.net - 寻找在我们的应用程序中实现版本控制功能的建议

sql - 将日期格式化为 2017-06-21T12 :33:47. 879 格式

python - Rawsql查询数组转化为格式化的html表

mysql - 关系数据库中自定义字段的设计模式

SQL Server 合并 WHEN NOT MATCHED 子句自定义

sql - 如何在sql查询中使用group by?