Как искать в поле изображения / varbinary записи, начинающиеся с двоичного шаблона - PullRequest
4 голосов
/ 01 августа 2011

Я пытаюсь найти все изображения, которые не начинаются с магического числа 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 Изображение типа данных аргумента недопустимо для аргумента 2 функции patindex.

Как правильно найти записи, которые не соответствуют магическому числу ff d8 ff e0?

UPDATE

Вот ссылка , чтобы проверить любые ваши предложения.


В конце концов решение Росса работало с некоторыми изменениями в запросе.

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


Я нашел еще лучшее решение, см. Мой ответ.

Ответы [ 3 ]

6 голосов
/ 01 августа 2011

Почему вы все еще используете тип данных IMAGE?Это устарело в пользу VARBINARY (MAX) ... если вы преобразуете свой столбец в VARBINARY (MAX), я думаю, вам будет намного проще работать с ним.

EDIT

В SQL Server 2008 вы можете использовать намного более простую конвертацию:

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

На самом деле это отлично работало в вашем запросе StackExchange (я подозреваю, что серверная часть не использует SQL Server 2005).

Но я рад, что мой ответ был настолько бесполезен для вас.Отмечено самому себе.

6 голосов
/ 02 августа 2011

Я нашел гораздо более простое решение, которое работает намного быстрее.

SELECT [cpclid] 
FROM [cp]
where cast(cpphoto as varbinary(4)) <> 0xFFD8FFE0
2 голосов
/ 01 августа 2011

Используйте where cpphoto not like 'FFD8FFE0%' в вашем предложении , где .

приведение cpphoto как varchar(max), если это уже не строка.

...