Det mest effektiva sättet jag kan tänka mig är att använda en beständig datorkolumn för ett hashvärde för bildkolumnen. Använd hashbytes för att beräkna hashen och lägga till en unik begränsning på den beräknade kolumnen.
Tabelldefinition:
create table Images
(
ID int identity primary key,
Img varbinary(max),
ImgHash as convert(varbinary(16), hashbytes('MD5', Img)) persisted unique
)
Exempelkod mot bildtabell:
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)
Den unika begränsningen skapar ett index som kommer att användas i frågan.
Din SP för att lägga till en bild kan se ut så här genom att använda merge och utgång med ett trick från det här svaret UPPDATERA -no-op i SQL MERGE-satsen tillhandahålls av 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;