sql >> Databasteknik >  >> RDS >> Sqlserver

Hur avgör man om en post med specifik IMAGE-datatyp redan finns i tabellen?

Det mest effektiva sättet jag kan tänka mig är att använda en beständig datorkolumn för ett hashvärde för bildkolumnen. Använd hashbytes för att beräkna hashen och lägga till en unik begränsning på den beräknade kolumnen.

Tabelldefinition:

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

Exempelkod mot bildtabell:

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)

Den unika begränsningen skapar ett index som kommer att användas i frågan.

Din SP för att lägga till en bild kan se ut så här genom att använda merge och utgång med ett trick från det här svaret UPPDATERA -no-op i SQL MERGE-satsen tillhandahålls av 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;  



  1. mysqli förberedd sats num_rows returnerar 0 medan frågan returnerar större än 0

  2. Hur listar man alla platspar med samma yta från tabellen i Oracle?

  3. Få ett visst kolumnvärde i oracle med inre join

  4. Tre enkla SQL Server-prestandavinster