Cách hiệu quả nhất mà tôi có thể nghĩ đến là sử dụng cột được tính cho giá trị băm của cột hình ảnh. Sử dụng hashbyte để tính toán băm và thêm một ràng buộc duy nhất trên cột được tính toán.
Định nghĩa bảng:
create table Images
(
ID int identity primary key,
Img varbinary(max),
ImgHash as convert(varbinary(16), hashbytes('MD5', Img)) persisted unique
)
Mã mẫu dựa trên bảng Hình ảnh:
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)
Ràng buộc duy nhất tạo ra một chỉ mục sẽ được sử dụng trong truy vấn.
SP của bạn để thêm hình ảnh có thể trông như thế này bằng cách sử dụng hợp nhất và đầu ra với một mẹo từ câu trả lời này CẬP NHẬT -no-op trong câu lệnh SQL MERGE được cung cấp bởi 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;