Le moyen le plus efficace auquel je puisse penser est d'utiliser une colonne calculée pour une valeur de hachage de la colonne image. Utilisez hashbytes pour calculer le hachage et ajouter une contrainte unique sur la colonne calculée.
Définition du tableau :
create table Images
(
ID int identity primary key,
Img varbinary(max),
ImgHash as convert(varbinary(16), hashbytes('MD5', Img)) persisted unique
)
Exemple de code par rapport au tableau Images :
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)
La contrainte unique crée un index qui sera utilisé dans la requête.
Votre SP pour ajouter une image pourrait ressembler à ceci en utilisant merge et sortie avec une astuce de cette réponse UPDATE -no-op dans l'instruction SQL MERGE fourni par 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;