2011-07-24 5 views
1

これを行う最も効果的な方法は何ですか?私はストアドプロシージャを探しています。新しいIDまたはそのイメージのレコードのIDを返します。イメージは最大15-20MBですが、ほとんどの場合は0.5-2MBになります。助けのための特定のIMAGEデータ型のレコードが既にテーブルに存在するかどうかを確認する方法はありますか?

おかげで、

+1

それはhttp://stackoverflow.com/questions/751054/compare-images-in-sql –

答えて

1

最も効果的な方法は、私は考えることができる最も効果的な方法は、画像列のハッシュ値持続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) 

ユニーク制約は、クエリで使用されるインデックスを作成します。

enter image description here

画像を追加するにはあなたのSPはAndriy Mが提供するこの答えUPDATE-no-op in SQL MERGE statementからトリックでmergeoutputを使用して、このようになります。

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; 
+0

ありがとう、私はその瞬間にそれをしようと説明してここにリンクがあります – Marshall

関連する問題