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 は存在するかどうかをチェックし、ハッシュ値が存在しない場合にのみ挿入する必要があります。

データは何があっても klient_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 に答える