これを行う最も効果的な方法は何ですか?私はストアドプロシージャを探しています。新しいIDまたはそのイメージのレコードのIDを返します。イメージは最大15-20MBですが、ほとんどの場合は0.5-2MBになります。助けのための特定のIMAGEデータ型のレコードが既にテーブルに存在するかどうかを確認する方法はありますか?
おかげで、
これを行う最も効果的な方法は何ですか?私はストアドプロシージャを探しています。新しいIDまたはそのイメージのレコードのIDを返します。イメージは最大15-20MBですが、ほとんどの場合は0.5-2MBになります。助けのための特定のIMAGEデータ型のレコードが既にテーブルに存在するかどうかを確認する方法はありますか?
おかげで、
最も効果的な方法は、私は考えることができる最も効果的な方法は、画像列のハッシュ値持続computed columnを使用することです。ハッシュ計算にはhashbytesを使用し、計算列にはunique constraintを追加してください。
テーブル定義:
create table Images
(
ID int identity primary key,
Img varbinary(max),
ImgHash as convert(varbinary(16), hashbytes('MD5', Img)) persisted unique
)
画像テーブルに対するサンプルコード:
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はAndriy Mが提供するこの答えUPDATE-no-op in SQL MERGE statementからトリックでmergeとoutputを使用して、このようになります。
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;
ありがとう、私はその瞬間にそれをしようと説明してここにリンクがあります – Marshall
それはhttp://stackoverflow.com/questions/751054/compare-images-in-sql –