Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Wie kann festgestellt werden, ob ein Datensatz mit einem bestimmten IMAGE-Datentyp bereits in der Tabelle vorhanden ist?

Der effektivste Weg, den ich mir vorstellen kann, ist die Verwendung einer persistenten berechneten Spalte für einen Hashwert der Bildspalte. Verwenden Sie Hashbytes um den Hash zu berechnen und eine eindeutige Einschränkung hinzuzufügen in der berechneten Spalte.

Tabellendefinition:

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

Beispielcode für die Bildertabelle:

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)

Die eindeutige Einschränkung erstellt einen Index, der in der Abfrage verwendet wird.

Ihr SP zum Hinzufügen eines Bildes könnte mit merge so aussehen und Ausgabe mit einem Trick aus dieser Antwort UPDATE -no-op in der SQL MERGE-Anweisung bereitgestellt von 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;