Cara paling efektif yang dapat saya pikirkan adalah dengan menggunakan kolom terhitung untuk nilai hash kolom gambar. Gunakan hashbytes untuk menghitung hash dan menambahkan batasan unik pada kolom yang dihitung.
Definisi tabel:
create table Images
(
ID int identity primary key,
Img varbinary(max),
ImgHash as convert(varbinary(16), hashbytes('MD5', Img)) persisted unique
)
Contoh kode terhadap tabel Gambar:
insert into Images values
(convert(varbinary(max), 'Image1')),
(convert(varbinary(max), 'Image2'))
declare @NewImage varbinary(max) = convert(varbinary(max), 'Image2')
select count(*)
from Images
where ImgHash = hashbytes('MD5', @NewImage)
Batasan unik membuat indeks yang akan digunakan dalam kueri.
SP Anda untuk menambahkan gambar dapat terlihat seperti ini menggunakan merge dan keluaran dengan trik dari jawaban ini PERBARUI -no-op dalam pernyataan SQL MERGE disediakan oleh Andriy M .
create procedure Images_Add
@NewImage varbinary(max)
as
declare @dummy int
merge Images as T
using (select @NewImage, hashbytes('MD5', @NewImage)) as S(Img, ImgHash)
on T.ImgHash = S.ImgHash
when not matched then
insert(Img) values(S.Img)
when matched then
update set @dummy = 0
output inserted.ID;