sql >> Base de Datos >  >> RDS >> Sqlserver

¿Cómo determinar si un registro con un tipo de datos de IMAGEN específico ya existe en la tabla?

La forma más efectiva que se me ocurre es usar una columna calculada persistente para un valor hash de la columna de la imagen. Utilice hashbytes para calcular el hash y agregar una restricción única en la columna calculada.

Definición de tabla:

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

Ejemplo de código contra la tabla Imágenes:

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 restricción única crea un índice que se utilizará en la consulta.

Su SP para agregar una imagen podría verse así usando merge y salida con un truco de esta respuesta ACTUALIZAR -no-op en declaración SQL MERGE proporcionado por 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;