varbinary para string no SQL Server

93

Como converter um valor de coluna de varbinary(max)para varcharem formato legível?

Bilgin Kılıç
fonte
3
eu quero varchar já que o valor foi isterted do valor da string .. Eu quero ler o que foi escrito ..
Bilgin Kılıç
@MartinSmith ppl me empurre para mudar. Então, marque sua resposta novamente. obrigado por seus comentários gentis.
Bilgin Kılıç
As pessoas parecem estar descobrindo isso nos mecanismos de pesquisa e, com base na votação, o parâmetro do estilo 2 parece mais comumente exigido, mas não corresponde ao seu requisito original
Martin Smith,

Respostas:

87

"Converter a varbinaryem a varchar" pode significar coisas diferentes.

Se o varbinary é a representação binária de uma string em SQL Server (por exemplo, voltou lançando a varbinarydiretamente ou a partir dos DecryptByPassPhraseou DECOMPRESSfunções) você só pode CASTele

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

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

Isso equivale a usar CONVERTcom um parâmetro de estilo de 0.

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

Outros parâmetros de estilo estão disponíveis CONVERTpara diferentes requisitos, conforme observado em outras respostas.

Martin Smith
fonte
38
ESTA RESPOSTA NÃO ESTÁ CORRETA. Eu testei em uma mesa com SIDs de usuário - a quantidade de valores distintos convertidos é menor que a quantidade de SIDs binários distintos. Você deve usar CONVERT (VARCHAR (...), binaryValue, 2) para obter um valor único - a resposta de Gunjan Juyal é a correta - deve ser marcada como solução
Philipp Munin
13
@PhilippMunin - As duas respostas fazem coisas diferentes. Este pega o resultado de uma expressão como a SELECT CAST('This is a test' AS VARBINARY(100))que está 0x5468697320697320612074657374em meu agrupamento padrão e o converte de volta para a varcharstring. A resposta de Gunjan retorna a representação hexadecimal como uma string ('5468697320697320612074657374'). Presumivelmente, essa interpretação está correta para a necessidade do OP conforme eles a aceitaram.
Martin Smith,
8
ESTA RESPOSTA ESTÁ CORRETA! Eu testei e ele faz o que eu e o OP desejamos.
Ronnie Overby,
1
@BIDeveloper se você leu os comentários acima (especificamente o meu), deve perceber que o problema é que "converter varbinary em varchar" pode ser interpretado de maneiras diferentes. Na verdade, é por isso que CONVERTtem um parâmetro de estilo para selecionar a maneira que você deseja (minha interpretação é o estilo padrão). Portanto, esta resposta pode não ser o que você precisa para o seu caso de uso no momento, mas é correta para outros casos de uso. Incluindo o questionador original que especificou "forma legível para humanos" e não hex.
Martin Smith
1
SQL 2005 você pode usar sys.fn_sqlvarbasetostr (@binary) já que CONVERT ficará em branco para mim
TheNerdyNerd
149

A seguinte expressão funcionou para mim:

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

Aqui estão mais detalhes sobre a escolha do estilo (o terceiro parâmetro).

Gunjan Juyal
fonte
Conforme descrito por @ lara-mayugba abaixo, o estilo 1 inclui o prefixo 0x no resultado que pode ser útil.
Stan
@celerno por que fariam isso? Isso não faz o que eles precisavam.
Martin Smith
1
Antes de 2008 usar sys.fn_sqlvarbasetostr (@binaryfield)
TheNerdyNerd
@metabuddy - de que forma é desinformação? Ele afirma que o termo "Converter um varbinary em um varchar" pode ser feito de maneiras diferentes e que são controladas pelo parâmetro de estilo. Só porque o parâmetro de estilo nessa resposta não é o que você precisa para o seu caso (mas é o que responde à pergunta original) não significa que seja desinformação
Martin Smith
Para enfatizar o comentário / resposta de @TheNerdyNerd, a expressão seria `select sys.fn_sqlvarbasetostr (@b) / * retorna 0x5468697320697320612074657374 * / Supondo que se altere varchar (max) para varchar (8000) porque pré-2008 não o usa .
Zachary Scott
63

Na verdade, a melhor resposta é

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

usar " 2" corta o " 0x" no início do varbinary.

Lara Mayugba
fonte
@BojieShuai Você quis dizer "Eu concordo tanto que é impossível concordar ainda mais" ou "Eu costumava concordar, mas não concordo mais"?
howcheng de
@howcheng quero dizer "não posso concordar mais". Obrigado por apontar isso.
Bojie Shuai de
15

Tente isto

SELECT CONVERT(varchar(5000), yourvarbincolumn, 0)
dmajkic
fonte
6
Tive que usar 2 como meu terceiro parâmetro, em vez de zero. Eu encontrei essa resposta aqui .
WEFX
1
no meu caso, tenho que usar MAX em vez de 5000
sulaiman sudirman
0

Para uma VARBINARY(MAX)coluna, tive que usar NVARCHAR(MAX):

cast(Content as nvarchar(max))

Ou

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

Eu tentei isso, funcionou para mim:

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

Dê uma olhada no abaixo, pois eu estava lutando para postar muito original [aqui] [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
fonte