varbinary en chaîne sur SQL Server

94

Comment convertir une valeur de colonne de varbinary(max)en varcharsous une forme lisible par l'homme?

Bilgin Kılıç
la source
3
je veux varchar puisque la valeur a été insérée à partir de la valeur de la chaîne .. Je veux dire lire ce qui a été écrit ..
Bilgin Kılıç
@MartinSmith ppl me pousse à changer. Donc, marquez votre réponse à nouveau. merci pour vos aimables commentaires.
Bilgin Kılıç
Les gens semblent rencontrer cela des moteurs de recherche et, sur la base du vote, le paramètre de style 2 semble plus couramment requis, mais cela ne correspond pas à votre exigence initiale
Martin Smith

Réponses:

88

«Convertir un varbinaryen un varchar» peut signifier différentes choses.

Si le varbinary est la représentation binaire d'une chaîne dans SQL Server (par exemple retourné par coulée à varbinarydirectement ou à partir des DecryptByPassPhraseou DECOMPRESSfonctions) , vous pouvez tout CASTce

declare @b varbinary(max)
set @b = 0x5468697320697320612074657374

select cast(@b as varchar(max)) /*Returns "This is a test"*/

C'est l'équivalent de l'utilisation CONVERTavec un paramètre de style de 0.

CONVERT(varchar(max), @b, 0)

D'autres paramètres de style sont disponibles CONVERTpour différentes exigences, comme indiqué dans d'autres réponses.

Martin Smith
la source
38
CETTE RÉPONSE N'EST PAS CORRECTE. Je l'ai testé sur une table avec des SID utilisateur - la quantité de valeurs castées distinctes est inférieure à la quantité de SID binaires distincts. Vous devez utiliser CONVERT (VARCHAR (...), binaryValue, 2) pour obtenir une valeur unique - la réponse de Gunjan Juyal est la bonne - elle doit être marquée comme solution
Philipp Munin
13
@PhilippMunin - Les deux réponses font des choses différentes. Celui-ci prend le résultat d'une expression telle que celle SELECT CAST('This is a test' AS VARBINARY(100))qui se trouve 0x5468697320697320612074657374dans mon classement par défaut et le convertit en varcharchaîne. La réponse de Gunjan renvoie la représentation hexadécimale sous forme de chaîne ('5468697320697320612074657374'). Vraisemblablement, cette interprétation est correcte pour le besoin du PO tel qu'il l'a accepté.
Martin Smith
8
CETTE RÉPONSE EST BONNE! Je l'ai testé et il fait ce que moi et l'OP voulions.
Ronnie Overby
1
@BIDeveloper si vous aviez lu les commentaires ci-dessus (en particulier le mien), vous devriez vous rendre compte que le problème est que "convertir varbinary en varchar" peut être interprété de différentes manières. En effet, c'est pourquoi CONVERTa un paramètre de style pour sélectionner la façon dont vous le souhaitez (mon interprétation est le style par défaut) .Cette réponse n'est donc peut-être pas ce dont vous avez besoin pour votre cas d'utilisation pour le moment, mais elle est correcte pour d'autres cas d'utilisation. Y compris le questionneur original qui a spécifié "forme lisible par l'homme" non hexadécimal.
Martin Smith
1
SQL 2005, vous pouvez utiliser sys.fn_sqlvarbasetostr (@binary) car le CONVERT sera vide pour moi
TheNerdyNerd
149

L'expression suivante a fonctionné pour moi:

SELECT CONVERT(VARCHAR(1000), varbinary_value, 2);

Voici plus de détails sur le choix du style (le troisième paramètre).

Gunjan Juyal
la source
Comme décrit par @ lara-mayugba ci-dessous, le style 1 inclut le préfixe 0x sur le résultat, ce qui peut être utile.
Stan
@celerno pourquoi le feraient-ils? Cela ne fait pas ce dont ils avaient besoin.
Martin Smith
1
Avant 2008, utilisez sys.fn_sqlvarbasetostr (@binaryfield)
TheNerdyNerd
@metabuddy - en quoi s'agit-il de désinformation? Il indique que le terme «Conversion d'un varbinary en varchar» peut être effectué de différentes manières et que celles-ci sont contrôlées par le paramètre style. Ce n'est pas parce que le paramètre de style dans cette réponse n'est pas celui dont vous avez besoin pour votre cas (mais celui qui répond à la question d'origine) qu'il s'agit d'une désinformation
Martin Smith
Pour souligner le commentaire / la réponse de @TheNerdyNerd, l'expression serait `select sys.fn_sqlvarbasetostr (@b) / * renvoie 0x5468697320697320612074657374 * / En supposant que l'on change varchar (max) en varchar (8000) parce qu'avant 2008 ne l'utilise pas .
Zachary Scott
63

En fait, la meilleure réponse est

SELECT CONVERT(VARCHAR(1000), varbinary_value, 1);

en utilisant " 2" coupe le " 0x" au début de varbinary.

Lara Mayugba
la source
@BojieShuai Vouliez-vous dire "Je suis tellement d'accord qu'il m'est impossible d'être encore plus d'accord", ou "J'étais d'accord mais je ne le fais plus"?
howcheng
@howcheng je veux dire "je ne peux pas être plus d'accord". Merci de l'avoir signalé.
Bojie Shuai
15

Essaye ça

SELECT CONVERT(varchar(5000), yourvarbincolumn, 0)
dmajkic
la source
6
J'ai dû utiliser un 2 comme troisième paramètre, au lieu d'un zéro. J'ai trouvé cette réponse ici .
WEFX
1
dans mon cas, je dois utiliser MAX au lieu de 5000
sulaiman sudirman
0

Pour une VARBINARY(MAX)chronique, j'ai dû utiliser NVARCHAR(MAX):

cast(Content as nvarchar(max))

Ou

CONVERT(NVARCHAR(MAX), Content, 0)
VARCHAR(MAX) didn't show the entire value
kristoffer_o
la source
0

J'ai essayé ceci, cela a fonctionné pour moi:

declare @b2 VARBINARY(MAX) 
set @b2 = 0x54006800690073002000690073002000610020007400650073007400
SELECT CONVERT(nVARCHAR(1000), @b2, 0);
Bala
la source
0

Jetez un œil à ce qui suit car j'avais du mal à publier un message trop original [Ici] [1]

bcp "SELECT CAST(BINARYCOL AS VARCHAR(MAX)) FROM OLTP_TABLE WHERE ID=123123 AND COMPANYID=123" 
queryout "C:\Users\USER\Documents\ps_scripts\res.txt" -c -S myserver.db.com  -U admin -P password


  [1]: https://stackoverflow.com/questions/60525910/powershell-truncating-sql-query-output?noredirect=1#comment107077512_60525910
ribbit
la source