【问题标题】:IF response unexpected result in stored procedure, unique key violationIF 响应意外导致存储过程,唯一键违规
【发布时间】:2013-06-10 16:13:43
【问题描述】:

我可能看这个太久了,所以我希望有人能帮助我。

我正在比较文件元数据以识别唯一的数据块,从而检测重复数据删除的潜力......这里是。

drop proc insertFile
go
create proc [dbo].[insertFile] @fileHash char(64), @name varchar(200)
as
set nocount on;
declare @fileId int
declare @klientId int
set @klientId = (SELECT cast(RAND() * 10 + 1 as int))


IF NOT EXISTS (select * from data_file where hash_key = '@fileHash')
begin
insert into data_file (hash_key) values (@fileHash)
end

set @fileId = (select id from data_file where hash_key = '@fileHash')
insert into klient_file (data_file, klient, name) values (@fileId, @klientId, @name)

hash_key 有一个唯一约束,当我输入一个存在的值时,这会被违反,这不应该发生,IF 检查它是否存在,并且只有在哈希值不存在时才应该插入。

数据无论如何都应该进入kclient_file...

再次,错误是违反唯一约束,应该通过 IF 检查避免,IF 自己工作,只是不在过程中。有什么想法吗? (这一切都在 localdb 实例上运行)

【问题讨论】:

    标签: sql tsql stored-procedures sql-server-2012 localdb


    【解决方案1】:

    EXISTS 检查中的引号内有您的参数,所以在这一行中

    IF NOT EXISTS (select * from data_file where hash_key = '@fileHash')
    

    您正在检查'@fileHash' 是否存在,而不是分配给参数的实际值,因此即使hash_key 存在,您也会尝试插入它,因为表中不存在'@FileHash'

    你的程序应该是:

    create proc [dbo].[insertFile] @fileHash char(64), @name varchar(200)
    as
    set nocount on;
    declare @fileId int
    declare @klientId int
    set @klientId = (SELECT cast(RAND() * 10 + 1 as int))
    
    
    IF NOT EXISTS (select * from data_file where hash_key = @fileHash)
        begin
            insert into data_file (hash_key) values (@fileHash)
        end
    
    set @fileId = (select id from data_file where hash_key = @fileHash)
    insert into klient_file (data_file, klient, name) values (@fileId, @klientId, @name)
    

    【讨论】:

      猜你喜欢
      • 2018-06-14
      • 1970-01-01
      • 1970-01-01
      • 2022-08-23
      • 1970-01-01
      • 2023-02-08
      • 1970-01-01
      • 2015-11-05
      • 2017-04-28
      相关资源
      最近更新 更多