Question

J'utilise SQL Server 2000 pour imprimer certaines valeurs d'une table à l'aide de PRINT . Avec la plupart des données non-chaînes, je peux transtyper vers nvarchar pour pouvoir les imprimer, mais les valeurs binaires tentent de convertir en utilisant la représentation en bits des caractères. Par exemple:

DECLARE @binvalue binary(4)
SET @binvalue = 0x12345678
PRINT CAST(@binvalue AS nvarchar)

Attendu:

  

0x12345678

Au lieu de cela, il imprime deux caractères de charabia.

Comment puis-je imprimer la valeur des données binaires? Y a-t-il une fonction intégrée ou dois-je rouler la mienne?

Mise à jour: Ce n'est pas la seule valeur sur la ligne, je ne peux donc pas simplement IMPRIMER @binvalue. C'est quelque chose qui ressemble plus à PRINT N'other stuff '+ ???? + Plus de choses '. Je ne suis pas sûr que cela fasse une différence: je n'ai pas simplement essayé PRINT @binvalue.

Était-ce utile?

La solution

Si vous étiez sur SQL Server 2005, vous pourriez utiliser ceci:

print master.sys.fn_varbintohexstr(@binvalue)

Je ne pense pas que cela existe sur 2000, cependant, vous devrez peut-être rouler vous-même.

Autres conseils

  

N'utilisez pas master.sys.fn_varbintohexstr - il est terriblement lent , non documenté, non pris en charge et pourrait disparaître dans une future version de SQL Server .

Si vous devez convertir binary (16) en caractère hexadécimal, utilisez convert :

convert(char(34), @binvalue, 1)

Pourquoi 34? parce que 16 * 2 + 2 = 34 , c’est-à-dire "0x". - 2 symboles, plus 2 symboles pour chaque caractère.

Nous avons essayé d'effectuer 2 requêtes sur une table de 200 000 lignes:

  1. select master.sys.fn_varbintohexstr(field)
    from table`
    
  2. select convert(char(34), field, 1)
    from table`
    

le premier dure 2 minutes, tandis que le second dure 4 secondes.

select convert(varchar(max), field , 1) 
from table

En utilisant varchar (max) , vous n’aurez plus à vous soucier de spécifier la taille (type de).

Ajouter une réponse qui montre un autre exemple de conversion de données binaires en chaîne hexagonale, et vice-versa.

Je souhaite convertir la valeur d'horodatage la plus élevée en varchar :

SELECT 
   CONVERT(
      varchar(50), 
      CAST(MAX(timestamp) AS varbinary(8)), 
      1) AS LastTS
FROM Users

Ce qui retourne:

LastTS
==================
0x000000000086862C

Remarque : il est important d'utiliser CONVERT pour convertir varbinary - > varchar . L'utilisation de CAST ne fonctionnera pas:

SELECT 
   CAST(
      CAST(MAX(timestamp) AS varbinary(8)) 
      AS varchar(50) ) AS LastTS
FROM Users

traitera les données binaires comme caractères plutôt que comme valeurs hexadécimales, renvoyant une chaîne vide.

Inversez-le

Pour reconvertir la chaîne hexadécimale stockée en un horodatage:

SELECT CAST(CONVERT(varbinary(50), '0x000000000086862C', 1) AS timestamp)
  

Remarque : tout code est publié dans le domaine public. Aucune attribution requise.

DECLARE @binvalue binary(4)
SET @binvalue = 0x61000000
PRINT @binvalue 
PRINT cast('a' AS binary(4))
PRINT cast(0x61 AS varchar)

Ne pas lancer.

La conversion convertit le binaire en texte par valeur sur le paramètre de classement correspondant pour la base de données spécifique.

[Commencer l'édition] Si vous avez besoin de la valeur imprimée dans une variable chaîne, utilisez la fonction suggérée par Eric Z Beard.

DECLARE @mybin1 binary(16)
DECLARE @s varchar(100)
SET @mybin1 = 0x098F6BCD4621D373CADE4E832627B4F6
SET @s = 'The value of @mybin1 is: ' + sys.fn_varbintohexsubstring(0, @mybin1,1,0)
PRINT @s

Si cette fonction n'est pas à votre disposition en raison des versions du serveur ou des autorisations spéciales, vous pouvez créer votre propre fonction.

Pour voir comment cette fonction a été implémentée dans l'édition SQL Server 2005 Express, vous pouvez exécuter:

sp_helptext 'fn_varbintohexsubstring'

Je suis tombé sur cette question en cherchant une solution à un problème similaire en imprimant la valeur hexadécimale renvoyée par la fonction 'hashbytes' dans SQL Server 2005.

Malheureusement, dans cette version de SQL Server, CONVERT ne semble pas fonctionner du tout, seul fn_varbintohexsubstring fait le bon choix:

J'ai fait:

DECLARE @binvalue binary(4)
SET @binvalue = 0x12345678
PRINT 'cast(@binvalue AS nvarchar): ' + CAST(@binvalue AS nvarchar)
PRINT 'convert(varchar(max), @binvalue, 0): ' + CONVERT(varchar(max), @binvalue, 0)
PRINT 'convert(varchar(max), @binvalue, 1): ' + CONVERT(varchar(max), @binvalue, 1)
PRINT 'convert(varchar(max), @binvalue, 2): ' + CONVERT(varchar(max), @binvalue, 2)
print 'master.sys.fn_varbintohexstr(@binvalue): ' + master.sys.fn_varbintohexstr(@binvalue)

Voici le résultat obtenu dans SQL Server 2005 (

cast(@binvalue AS nvarchar): 㐒硖
convert(varchar(max), @binvalue, 0): 4Vx
convert(varchar(max), @binvalue, 1): 4Vx
convert(varchar(max), @binvalue, 2): 4Vx
master.sys.fn_varbintohexstr(@binvalue): 0x12345678

(il y a en fait un caractère non imprimable avant les '4Vx - je posterais une image, mais je n'ai pas encore assez de points).

Modifier : il suffit d'ajouter SQL Server 2008 R2 au problème, le problème lié à CONVERT est résolu avec la sortie suivante:

cast(@binvalue AS nvarchar): 㐒硖
convert(varchar(max), @binvalue, 0): 4Vx
convert(varchar(max), @binvalue, 1): 0x12345678
convert(varchar(max), @binvalue, 2): 12345678
master.sys.fn_varbintohexstr(@binvalue): 0x12345678
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top