0

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

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

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 实例上运行)

4

1 回答 1

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)
于 2013-06-10T16:21:46.080 回答