私が考えることができる最も効果的な方法は、永続化された 計算列を使用することです> image 列のハッシュ値。 ハッシュバイト を使用する ハッシュを計算し、一意の制約 を追加します
テーブル定義:
create table Images( ID int identity primary key, Img varbinary(max), ImgHash as convert(varbinary(16), hashbytes('MD5', Img)) persisted unique)
プレ>Images テーブルに対するサンプル コード:
insert into Images values (convert(varbinary(max), 'Image1')),(convert(varbinary(max), 'Image2'))declare @NewImage varbinary(max) =convert(varbinary(max) ), 'Image2')select count(*)from Imageswhere ImgHash =hashbytes('MD5', @NewImage)
プレ>一意の制約により、クエリで使用されるインデックスが作成されます。
画像を追加する SP は、merge を使用して次のようになります。 および 出力 この回答からのトリックで-SQL MERGE ステートメントで何もしない Andriy M 提供 .
create procedure Images_Add @NewImage varbinary(max)as declare @dummy intmerge Images as Tusing (select @NewImage, hashbytes('MD5', @NewImage)) as S(Img, ImgHash)on T.ImgHash =S.ImgHash が一致しない場合は挿入 (Img) 値 (S.Img) が一致する場合は更新セット @dummy =0 output inserted.ID; コード> プレ>