Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Как да определите дали запис със специфичен тип данни IMAGE вече съществува в таблицата?

Най-ефективният начин, за който се сещам, е да използвам постоянна изчислена колона за хеш стойност на графичната колона. Използвайте хешбайтове за изчисляване на хеша и добавяне на уникално ограничение върху изчислената колона.

Дефиниция на таблица:

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

Примерен код срещу таблица с изображения:

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)

Уникалното ограничение създава индекс, който ще се използва в заявката.

Вашият SP за добавяне на изображение може да изглежда така, като използвате обединяване и изход с трик от този отговор АКТУАЛИЗИРАНЕ -no-op в израза SQL MERGE предоставено от Андрий М .

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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Разбиране на заключването на SQL Server за защитена среда на база данни

  2. Как да се свържа с MS SQL Server с помощта на Inno Setup?

  3. Възможно ли е да се използва потребителски дефиниран тип таблица в друг потребителски дефиниран тип таблица в sql

  4. Генериране на sql код програмно

  5. SQL - Извикване на съхранена процедура за всеки запис