Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Come determinare se nella tabella esiste già un record con un tipo di dati IMAGE specifico?

Il modo più efficace che mi viene in mente è utilizzare una colonna calcolata per un valore hash della colonna dell'immagine. Usa hashbyte per calcolare l'hash e aggiungere un vincolo univoco nella colonna calcolata.

Definizione della tabella:

create table Images
(
  ID int identity primary key, 
  Img varbinary(max),
  ImgHash as convert(varbinary(16), hashbytes('MD5', Img)) persisted unique
)

Codice di esempio rispetto alla tabella Immagini:

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)

Il vincolo univoco crea un indice che verrà utilizzato nella query.

Il tuo SP per aggiungere un'immagine potrebbe essere simile a questo utilizzando merge e output con un trucco da questa risposta UPDATE -no-op nell'istruzione SQL MERGE fornito da 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;