Codificación Base64 en SQL Server 2005 T-SQL

Resuelto Jacob asked hace 13 años • 11 respuestas

Me gustaría escribir una consulta T-SQL en la que codifico una cadena como una cadena Base64. Sorprendentemente, no puedo encontrar ninguna función T-SQL nativa para realizar la codificación Base64. ¿Existe una función nativa? Si no, ¿cuál es la mejor manera de realizar la codificación Base64 en T-SQL?

Jacob avatar Feb 23 '11 01:02 Jacob
Aceptado

Sé que esto ya ha sido respondido, pero dediqué más tiempo del que me gustaría admitir a crear declaraciones SQL de una sola línea para lograr esto, así que las compartiré aquí en caso de que alguien más necesite hacer lo mismo:

-- Encode the string "TestData" in Base64 to get "VGVzdERhdGE="
SELECT
    CAST(N'' AS XML).value(
          'xs:base64Binary(xs:hexBinary(sql:column("bin")))'
        , 'VARCHAR(MAX)'
    )   Base64Encoding
FROM (
    SELECT CAST('TestData' AS VARBINARY(MAX)) AS bin
) AS bin_sql_server_temp;

-- Decode the Base64-encoded string "VGVzdERhdGE=" to get back "TestData"
SELECT 
    CAST(
        CAST(N'' AS XML).value(
            'xs:base64Binary("VGVzdERhdGE=")'
          , 'VARBINARY(MAX)'
        ) 
        AS VARCHAR(MAX)
    )   ASCIIEncoding
;

Tuve que usar una tabla generada por subconsulta en la primera consulta (codificación) porque no pude encontrar ninguna forma de convertir el valor original ("TestData") a su representación de cadena hexadecimal ("5465737444617461") para incluirlo como argumento para xs:hexBinary() en la declaración XQuery.

mercurial avatar Nov 23 '2011 18:11 mercurial

La forma más sencilla y corta que pude encontrar para SQL Server 2012 y versiones posteriores es BINARY BASE64:

SELECT CAST('string' as varbinary(max)) FOR XML PATH(''), BINARY BASE64

Para que Base64 encadene

SELECT CAST( CAST( 'c3RyaW5n' as XML ).value('.','varbinary(max)') AS varchar(max) )

(o nvarchar(max)para cadenas Unicode)

Slai avatar Aug 26 '2015 16:08 Slai

Aquí hay una modificación a la respuesta de Mercurial que también usa la subconsulta en la decodificación, lo que permite el uso de variables en ambos casos.

DECLARE
    @EncodeIn VARCHAR(100) = 'Test String In',
    @EncodeOut VARCHAR(500),
    @DecodeOut VARCHAR(200)    

SELECT @EncodeOut = 
    CAST(N'' AS XML).value(
          'xs:base64Binary(xs:hexBinary(sql:column("bin")))'
        , 'VARCHAR(MAX)'
    )
FROM (
    SELECT CAST(@EncodeIn AS VARBINARY(MAX)) AS bin
) AS bin_sql_server_temp;

PRINT @EncodeOut

SELECT @DecodeOut = 
CAST(
    CAST(N'' AS XML).value(
        'xs:base64Binary(sql:column("bin"))'
      , 'VARBINARY(MAX)'
    ) 
    AS VARCHAR(MAX)
) 
FROM (
    SELECT CAST(@EncodeOut AS VARCHAR(MAX)) AS bin
) AS bin_sql_server_temp;

PRINT @DecodeOut
Joey Gennari avatar Jul 06 '2012 19:07 Joey Gennari