Comment rechercher une image/varbinary champ pour les enregistrements qui commencent par un modèle binaire
Je suis en train d'essayer de trouver toutes les images qui ne commencent pas avec la nombre magique ff d8 ff e0
(la signature pour jpg) Selon la MSDN je devrais être en mesure d'utiliser patindex sur mes données. Cependant
SELECT TOP 1000 [cpclid]
FROM [cp]
where patindex('FFD8FFE0%', cpphoto) = 0 -- cpphoto is a column type of image
me donne l'erreur
Msg 8116, Niveau 16, État 1, Ligne 1
Argument de type de données de l'image n'est pas valide pour l'argument 2 de patindex fonction.
Quelle serait la bonne façon de trouver les enregistrements qui ne correspondent pas au nombre magique de ff d8 ff e0
?
Mise à JOUR:
Voici un lien pour tester toutes les suggestions que vous avez.
j'ai Ross solution a fonctionné à la fin avec quelques ajustements sur la requête.
SELECT [cpclid]
FROM [cp]
where convert(varchar(max), cast(cpphoto as varbinary(max))) not like convert(varchar(max), 0xFFD8FFE0 ) + '%'
J'ai trouvé une solution encore meilleure, voir ma réponse.
OriginalL'auteur Scott Chamberlain | 2011-08-01
Vous devez vous connecter pour publier un commentaire.
Pourquoi êtes-vous toujours en utilisant le type de données d'IMAGE? Il a été dépréciée en faveur de VARBINARY(MAX)... si vous convertissez votre colonne de type VARBINARY(MAX) je pense que vous le trouverez beaucoup plus facile de travailler avec.
MODIFIER
Dans SQL Server 2008, vous pouvez utiliser beaucoup plus facile de convertir:
En fait, cela a très bien fonctionné sur votre StackExchange requête (je soupçonne que la fin n'est pas à l'aide de SQL Server 2005).
Mais je suis content que ma réponse était donc inutile pour vous. Noté pour le soi.
Je m'excuse de ne pas fournir suffisamment d'informations pour répondre à vos besoins pour ne pas descendre en-voté. J'ai pensé qu'il était implicite que si vous voulez faire une comparaison de chaîne vous pouvez également avoir à les convertir à varchar (que cette information a déjà été donnée dans les autres réponses). Vous n'avez donc essayer
SELECT TOP 1 CONVERT(VARCHAR(MAX), CONVERT(VARBINARY(MAX), image_column)) FROM table_name;
? À quoi ressemblait-il?Cela fonctionne pour les GIFs (je vois Gif89a au début de la sortie), mais je n'ai pas de vrai Jpg stockés comme des gouttes d'essayer.
Cette requête renvoie une chaîne vide. Toutefois, l'utilisation d'une distribution au lieu d'une conversion sur la conversion intérieure me donne 'ÿØÿà" qui je peux comparer. Voir mis à jour mon post original sur la solution que j'ai trouvé, si vous avez une meilleure solution, je vous en serais très reconnaissante. (ALORS ne me laisse pas enlever le bas de vote jusqu'à ce que votre modifier votre réponse.)
CAST vous donne une réponse différente de celle de CONVERTIR? On dirait que vous avez trouvé un bug inconnu dans SQL Server. Pouvez-vous le démontrer à l'aide d'un StackExchange requête (et comment vous comparez yoya vos critères de recherche)?
OriginalL'auteur Aaron Bertrand
J'ai trouvé une solution beaucoup plus simple qui fonctionne beaucoup plus rapidement.
WHERE CAST( [document] as varbinary(2)) <> 0x798C
OriginalL'auteur Scott Chamberlain
Utilisation
where cpphoto not like 'FFD8FFE0%'
dans votre où clause.cast cpphoto comme un
varchar(max)
si ce n'est pas une chaîne de caractères déjà.cavemansblog.wordpress.com/2009/04/24/... Oh, utiliser Convertir au lieu de cela, 2e instruction select au lien.
Il ne fonctionne pas comme vous pensez que cela fonctionne, qui est réelle texte stocké dans un champ binaire, j'ai besoin de correspondre à un modèle binaire, pas un modèle de texte Voir la colonne 3
Il a travaillé, mais j'ai dû ruser un peu, je vais mettre à jour le poste principal sur la façon de le faire.
OriginalL'auteur Ross Barbish