Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Jak ustalić, czy rekord z określonym typem danych IMAGE już istnieje w tabeli?

Najskuteczniejszym sposobem, jaki przychodzi mi do głowy, jest użycie utrwalonej kolumny obliczanej dla wartości skrótu kolumny obrazu. Użyj hashbytes aby obliczyć skrót i dodać unikalne ograniczenie w kolumnie obliczeniowej.

Definicja tabeli:

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

Przykładowy kod z tabelą obrazów:

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)

Unikalne ograniczenie tworzy indeks, który zostanie użyty w zapytaniu.

Twój SP, aby dodać obraz, może wyglądać tak przy użyciu merge i wyjście z trikiem z tej odpowiedzi AKTUALIZACJA -no-op w instrukcji SQL MERGE dostarczone przez 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. Transactionscope rzucający wyjątek ta platforma nie obsługuje transakcji rozproszonych podczas otwierania obiektu połączenia

  2. Aktualizowanie dostawcy danych Crystal Reports

  3. Zadanie agenta SQL Server — eksport wyników do pliku rozdzielanego tabulatorami?

  4. Jak utworzyć śledzenie SQL w celu przechwytywania zdarzeń serwera SQL

  5. Automatyzacja defragmentacji indeksów w bazie danych MS SQL Server