De meest effectieve manier die ik kan bedenken is het gebruik van een persistente berekende kolom voor een hash-waarde van de afbeeldingskolom. Gebruik hashbytes om de hash te berekenen en een unieke beperking toe te voegen op de berekende kolom.
Tabeldefinitie:
create table Images
(
ID int identity primary key,
Img varbinary(max),
ImgHash as convert(varbinary(16), hashbytes('MD5', Img)) persisted unique
)
Voorbeeldcode tegen afbeeldingentabel:
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)
De unieke beperking creëert een index die in de zoekopdracht zal worden gebruikt.
Uw SP om een afbeelding toe te voegen kan er als volgt uitzien met samenvoegen en uitvoer met een truc uit dit antwoord UPDATE -no-op in SQL MERGE-instructie geleverd door 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;