Как определить, существует ли в таблице запись с определенным типом данных IMAGE? - PullRequest
1 голос
/ 24 июля 2011

Какой самый эффективный способ сделать это?Я ищу хранимую процедуру, которая возвращает мне новый идентификатор или идентификатор записи с этим изображением.Изображение может быть до 15-20 МБ, но в основном это будет 0,5-2 МБ.

Спасибо за помощь,

1 Ответ

1 голос
/ 25 июля 2011

самый эффективный способ

Самый эффективный способ, который я могу придумать, - это использовать постоянный вычисляемый столбец для хеш-значения столбца изображения.Используйте хэш-байтов для вычисления хэша и добавьте уникальное ограничение для вычисляемого столбца.

Определение таблицы:

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

Пример кода для изображенийtable:

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)

Уникальное ограничение создает индекс, который будет использоваться в запросе.

enter image description here

Ваш SP для добавления изображения может выглядеть следующим образомиспользование слияния и вывода с трюком из этого ответа UPDATE-no-op в операторе SQL MERGE , предоставленным 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;  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...