Je souhaite effectuer la conversion dans T-SQL d'un type varbinary
en type chaîne
Voici un exemple :
D'abord j'ai eu cette varbinary
0x21232F297A57A5A743894A0E4A801FC3
Et puis je veux le convertir en
21232f297a57a5a743894a0e4a801fc3
Comment faire ça?
Essayer:
DECLARE @varbinaryField varbinary(max);
SET @varbinaryField = 0x21232F297A57A5A743894A0E4A801FC3;
SELECT CONVERT(varchar(max),@varbinaryField,2),
@varbinaryField
MISE À JOUR: Pour SQL Server 2008
Je sais que c’est une vieille question, mais voici une approche alternative que j’ai trouvée plus utile dans certaines situations. Je crois que la fonction master.dbo.fn_varbintohexstr est disponible dans SQL Server au moins depuis SQL2K. L'ajouter ici juste pour être complet. Certains lecteurs trouveront peut-être aussi instructif de regarder le code source de cette fonction.
declare @source varbinary(max);
set @source = 0x21232F297A57A5A743894A0E4A801FC3;
select varbin_source = @source
,string_result = master.dbo.fn_varbintohexstr (@source)
Si vous voulez convertir une valeur VARBINARY
unique en VARCHAR
(STRING
), vous pouvez le faire en déclarant une variable comme celle-ci:
DECLARE @var VARBINARY(MAX)
SET @var = 0x21232F297A57A5A743894A0E4A801FC3
SELECT CAST(@var AS VARCHAR(MAX))
Si vous essayez de sélectionner une colonne de table, procédez comme suit:
SELECT CAST(myBinaryCol AS VARCHAR(MAX))
FROM myTable
Cela fonctionne dans SQL 2005 et 2008:
declare @source varbinary(max);
set @source = 0x21232F297A57A5A743894A0E4A801FC3;
select cast('' as xml).value('xs:hexBinary(sql:variable("@source"))', 'varchar(max)');
J'ai cherché partout une réponse et finalement cela a fonctionné pour moi:
SELECT Lower(Substring(MASTER.dbo.Fn_varbintohexstr(0x21232F297A57A5A743894A0E4A801FC3), 3, 8000))
Sorties vers (chaîne):
21232f297a57a5a743894a0e4a801fc3
Vous pouvez également l'utiliser dans vos conditions WHERE ou JOIN si vous souhaitez comparer/faire correspondre des enregistrements varbinary avec des chaînes.
Voici un exemple simple que j'ai écrit pour convertir et reconvertir en utilisant les 2 méthodes de conversion, je l'ai également vérifié avec une chaîne fixe
declarer @ VB1 VARBINAIRE (500), @ VB2 VARBINAIRE (500), @ VB3 VARBINAIRE (500)
declare @ S1 VARCHAR (500)
SET @ VB1 = HASHBYTES ('SHA1', 'Test')
SET @ S1 = CONVERT (varchar (500), @ VB1,2)
SET @ VB2 = CONVERT (varbinary (500), @ S1,2)
SET @ VB3 = CONVERT (varbinary (500), '640AB2BAE07BEDC4C163F679A746F7AB7FB5D1FA', 2)
SELECT @ VB1, @ S1, @ VB2, @ VB3
IF @ VB1 = @ VB2 PRINT 'Ils correspondent (2)'
IF @ VB1 = @ VB3 PRINT 'Ils correspondent (3)'
PRINT str (Len (@ VB1))
PRINT str (Len (@ S1))
PRINT str (Len (@ VB2))
SET @ VB1 = HASHBYTES ('SHA1', 'Test')
SET @ S1 = CONVERT (varchar (500), @ VB1,1)
SET @ VB2 = CONVERT (varbinary (500), @ S1,1)
SELECT @ VB1, @ S1, @ VB2
IF @ VB1 = @ VB2 PRINT 'Ils correspondent (1)'
PRINT str (Len (@ VB1))
PRINT str (Len (@ S1))
PRINT str (Len (@ VB2))
et la sortie
. ||| .__ 0x640AB2BAE07BEDC4C163F679A746F7AB7FB5D1FA | 640AB2BAE07BEDC4C163F679A746F7AB7FB5D1FA | 0x640AB2BAE07BEDC4C163F679A746F7AB7FB5D1FA | 0x640AB2BAE07BEDC4C163F679A746F7AB7FB5D1FA
(1 rangée (s) touchée (s))
Ils correspondent (2)
Ils correspondent (3)
20
40
20
|| 0x640AB2BAE07BEDC4C163F679A746F7AB7FB5D1FA | 0x640AB2BAE07BEDC4C163F679A746F7AB7FB5D1FA | 0x640AB2BAE07BEDC4C163F79A1
(1 rangée (s) touchée (s))
Ils correspondent (1)
20
42
20