Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Comment déterminer si un enregistrement avec un type de données IMAGE spécifique existe déjà dans la table ?

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;