Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

Làm cách nào để xác định liệu bản ghi có kiểu dữ liệu IMAGE cụ thể đã tồn tại trong bảng hay chưa?

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 đầ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;  



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Làm cách nào để thực hiện GROUP BY trên một cột bí danh trong MS-SQL Server?

  2. Tinh chỉnh chỉ mục không gian địa lý

  3. Nhận kích thước của tất cả các bảng trong cơ sở dữ liệu

  4. Kiểm tra xem bảng tạm thời có tồn tại hay không và xóa nếu bảng đó tồn tại trước khi tạo bảng tạm thời

  5. Bật tác nhân SQL Server qua SSMS