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?


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.


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).


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.


@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)

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

0

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

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

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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.