我想在我的表中插入数据,但只插入我的数据库中不存在的数据!
这是我的代码:
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'附近的语法不正确 .
9 回答
试试下面的代码
而不是代码
用 . . . 来代替
Updated : (感谢@Marc Durdin指点)
请注意,在高负载下,这仍然有时会失败,因为第二个连接可以在第一个连接执行INSERT之前通过IF NOT EXISTS测试,即竞争条件 . 请参阅stackoverflow.com/a/3791506/1836776以获得有关为什么即使在事务中包装也无法解决此问题的答案 .
对于那些寻找最快速方式的人来说,我最近came across these benchmarks显然使用"INSERT SELECT... EXCEPT SELECT..."成为5000万或更多记录中最快的 .
这是文章中的一些示例代码(第3块代码是最快的):
我会使用合并:
INSERT
命令没有WHERE
子句 - 您必须像这样编写它:我用SQL SERVER 2012做了同样的事情并且它起作用了
除了IF EXISTS之外,您还可以使用MERGE,具体取决于您的SQL Server版本(2012?):
您可以使用GO命令 . 这将在发生错误后重新启动sql语句的执行 . 在我的情况下,我有几个1000 INSERT语句,其中少数这些记录已存在于数据库中,我只是不知道哪些 . 我发现在处理了几个100之后,执行只是因为记录已经存在而无法INSERT的错误消息而停止 . 相当讨厌,但是把GO解决了这个问题 . 它可能不是最快的解决方案,但速度不是我的问题 .
As explained in below code: 执行以下查询并验证自己(它们是不言自明的)
插入记录:
现在,尝试再次插入相同的记录:
插入不同的记录: