varbinary a cadena en SQL Server

94

Cómo convertir un valor de columna de varbinary(max) a varcharen forma legible por humanos?

Bilgin Kılıç
fuente
3
quiero varchar ya que el valor se extrajo del valor de la cadena ... quiero decir leer lo que se escribió ...
Bilgin Kılıç
@MartinSmith ppl empujame a cambiar. Así que marcó su respuesta de nuevo. gracias por sus amables comentarios.
Bilgin Kılıç
La gente parece estar encontrando esto en los motores de búsqueda y, según la votación, el parámetro de estilo 2 parece más comúnmente requerido, pero esto no cumple con su requisito original
Martin Smith

Respuestas:

88

"Convertir a en varbinarya varchar" puede significar cosas diferentes.

Si varbinary es la representación binaria de una cadena en SQL Server (por ejemplo, devuelta al convertir varbinarydirectamente o desde las funciones DecryptByPassPhraseo DECOMPRESS), puede CASThacerlo

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

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

Este es el equivalente a usar CONVERTcon un parámetro de estilo de 0.

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

Hay otros parámetros de estilo disponibles CONVERTpara diferentes requisitos, como se indica en otras respuestas.

Martin Smith
fuente
38
ESTA RESPUESTA NO ES CORRECTA. Lo probé en la mesa con los SID de usuario: la cantidad de valores distintos emitidos es menor que la cantidad de SID binarios distintos. Debe usar CONVERT (VARCHAR (...), binaryValue, 2) para obtener un valor único; la respuesta de Gunjan Juyal es la correcta; debe marcarse como solución
Philipp Munin
13
@PhilippMunin - Las dos respuestas hacen cosas diferentes. Este toma el resultado de una expresión como la SELECT CAST('This is a test' AS VARBINARY(100))que está 0x5468697320697320612074657374en mi intercalación predeterminada y la convierte de nuevo en la varcharcadena. La respuesta de Gunjan devuelve la representación hexadecimal como una cadena ('5468697320697320612074657374') Presumiblemente, esta interpretación es correcta para la necesidad del OP, ya que la aceptaron.
Martin Smith
8
ESTA RESPUESTA ES CORRECTA! Lo probé y hace lo que yo y el OP deseamos.
Ronnie Overby
1
@BIDeveloper si ha leído los comentarios anteriores (específicamente el mío) debería darse cuenta de que el problema es que "convertir varbinary a varchar" se puede interpretar de diferentes maneras. De hecho, esta es la razón por la que CONVERTtiene un parámetro de estilo para seleccionar la forma que desee (mi interpretación es el estilo predeterminado) .Por lo tanto, esta respuesta puede no ser la que necesita para su caso de uso en este momento, pero es correcta para otros casos de uso. Incluyendo el interrogador original que especificó "forma legible por humanos" no hexadecimal.
Martin Smith
1
SQL 2005 puede usar sys.fn_sqlvarbasetostr (@binary) ya que CONVERT estará en blanco para mí
TheNerdyNerd
149

La siguiente expresión funcionó para mí:

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

Aquí hay más detalles sobre la elección del estilo (el tercer parámetro).

Gunjan Juyal
fuente
Como lo describe @ lara-mayugba a continuación, el estilo 1 incluye el prefijo 0x en el resultado que puede ser útil.
Stan
@celerno, ¿por qué iban a hacerlo? Esto no hace lo que necesitaban.
Martin Smith
1
Antes de 2008 use sys.fn_sqlvarbasetostr (@binaryfield)
TheNerdyNerd
@metabuddy - ¿de qué manera es desinformación? Afirma que el término "Convertir un varbinary en un varchar" se puede hacer de diferentes formas y que estas están controladas por el parámetro de estilo. El hecho de que el parámetro de estilo en esa respuesta no sea el que necesita para su caso (pero es el que responde a la pregunta original) no significa información errónea
Martin Smith
Para enfatizar el comentario / respuesta de @TheNerdyNerd, la expresión sería `select sys.fn_sqlvarbasetostr (@b) / * returns 0x5468697320697320612074657374 * / Suponiendo que uno cambia varchar (max) a varchar (8000) porque antes de 2008 no lo usa .
Zachary Scott
63

En realidad, la mejor respuesta es

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

el uso de " 2" corta el " 0x" al comienzo del varbinary.

Lara Mayugba
fuente
@BojieShuai ¿Querías decir "Estoy tan de acuerdo que es imposible para mí estar aún más de acuerdo", o "Solía ​​estar de acuerdo pero ya no lo hago"?
Howcheng
@howcheng quiero decir "no puedo estar más de acuerdo". Gracias por señalar esto.
Bojie Shuai
15

Prueba esto

SELECT CONVERT(varchar(5000), yourvarbincolumn, 0)
dmajkic
fuente
6
Tuve que usar un 2 como tercer parámetro, en lugar de un cero. Encontré esa respuesta aquí .
WEFX
1
en mi caso tengo que usar MAX en lugar de 5000
sulaiman sudirman
0

Para una VARBINARY(MAX)columna, tuve que usar NVARCHAR(MAX):

cast(Content as nvarchar(max))

O

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

Intenté esto, funcionó para mí:

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

Prueba lo siguiente, ya que estaba luchando con una publicación demasiado original [Aquí] [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
fuente