4

マジック ナンバー ff d8 ff e0(jpg の署名) で始まらないすべての画像を検索しようとしています。MSDNによると、データに対して patindex を使用できるはずです。でも

SELECT TOP 1000 [cpclid]
FROM [cp]
where patindex('FFD8FFE0%', cpphoto) = 0 -- cpphoto is a column type of image

エラーが表示されます

メッセージ 8116、レベル 16、状態 1、行 1 patindex 関数の引数 2 の引数データ型イメージが無効です。

のマジックナンバーに一致しないレコードを見つける正しい方法はff d8 ff e0?

更新

これは、あなたが持っている提案をテストするためのリンクです。


I Ross のソリューションは、クエリの内容を微調整することで最終的に機能しました。

SELECT [cpclid]
  FROM [cp]
where convert(varchar(max), cast(cpphoto as varbinary(max))) not like convert(varchar(max), 0xFFD8FFE0 ) + '%'

さらに良い解決策を見つけました。私の答えを見てください。

4

3 に答える 3

7

はるかに高速に実行される、はるかに単純なソリューションを見つけました。

SELECT [cpclid] 
FROM [cp]
where cast(cpphoto as varbinary(4)) <> 0xFFD8FFE0
于 2011-08-01T20:24:14.990 に答える
6

なぜまだ IMAGE データ型を使用しているのですか? VARBINARY(MAX) を支持して廃止されました...列を VARBINARY(MAX) に変換すると、作業がずっと簡単になると思います。

編集

SQL Server 2008 では、はるかに簡単な変換を使用できます。

SELECT CONVERT(VARCHAR(MAX), CONVERT(VARBINARY(MAX), cpphoto), 2) FROM cpphoto;

実際、これは StackExchange クエリで問題なく機能しました (バックエンドは SQL Server 2005 を使用していないと思われます)。

しかし、私の答えがあなたにとって役に立たなかったことをうれしく思います。自己メモ。

于 2011-08-01T17:00:36.770 に答える
2

where句で使用where cpphoto not like 'FFD8FFE0%'します。

varchar(max)まだ文字列でない場合は、cpphoto を としてキャストします。

于 2011-08-01T16:54:37.350 に答える