varbinary para string no SQL Server


93

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


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.


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


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.


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

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

0

Eu tentei isso, funcionou para mim:

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

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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.