самый эффективный способ
Самый эффективный способ, который я могу придумать, - это использовать постоянный вычисляемый столбец для хеш-значения столбца изображения.Используйте хэш-байтов для вычисления хэша и добавьте уникальное ограничение для вычисляемого столбца.
Определение таблицы:
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)
Уникальное ограничение создает индекс, который будет использоваться в запросе.

Ваш 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;