Codificación Base64 en SQL Server 2005 T-SQL

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

Sé que esto ya ha sido respondido, pero acabo de pasar más tiempo del que me importa para admitir crear declaraciones SQL de una sola línea para lograr esto, así que las compartiré aquí en caso de que alguien más tenga que 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 (encoding) porque no pude encontrar ninguna forma de convertir el valor original (“TestData”) en su representación de cadena hexadecimal (“5465737444617461”) para incluirlo como argumento para xs: hexBinary () en la instrucción XQuery.

¡Espero que esto ayude a alguien!

La manera más simple y corta que pude encontrar para SQL Server 2012 y superior es BINARY BASE64 :

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

Para Base64 a una cadena

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

(o nvarchar(max) para cadenas Unicode)

Aquí hay una modificación a la respuesta de mercurial que también utiliza la subconsulta en la deencoding, permitiendo el uso de variables en ambas instancias.

 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 

Aquí está el código para las funciones que harán el trabajo

 -- To Base64 string CREATE FUNCTION [dbo].[fn_str_TO_BASE64] ( @STRING VARCHAR(MAX) ) RETURNS VARCHAR(MAX) AS BEGIN RETURN ( SELECT CAST(N'' AS XML).value( 'xs:base64Binary(xs:hexBinary(sql:column("bin")))' , 'VARCHAR(MAX)' ) Base64Encoding FROM ( SELECT CAST(@STRING AS VARBINARY(MAX)) AS bin ) AS bin_sql_server_temp ) END GO -- From Base64 string CREATE FUNCTION [dbo].[fn_str_FROM_BASE64] ( @BASE64_STRING VARCHAR(MAX) ) RETURNS VARCHAR(MAX) AS BEGIN RETURN ( SELECT CAST( CAST(N'' AS XML).value('xs:base64Binary(sql:variable("@BASE64_STRING"))', 'VARBINARY(MAX)') AS VARCHAR(MAX) ) UTF8Encoding ) END 

No, no hay una función nativa, este método me ha funcionado en el pasado: http://www.motobit.com/help/scptutl/sa306.htm
también lo tiene este método:
http://www.vbforums.com/showthread.php?t=554886

Me encantó la respuesta de @ Slai. Solo tuve que hacer pequeñas modificaciones en las frases que estaba buscando. Pensé en compartir lo que terminé en caso de que ayude a alguien más a tropezar en esta página como yo lo hice:

 DECLARE @Source VARCHAR(50) = '12345' DECLARE @Encoded VARCHAR(500) = CONVERT(VARCHAR(500), (SELECT CONVERT(VARBINARY, @Source) FOR XML PATH(''), BINARY BASE64)) DECLARE @Decoded VARCHAR(500) = CONVERT(VARCHAR(500), CONVERT(XML, @Encoded).value('.','varbinary(max)')) SELECT @Source AS [Source], @Encoded AS [Encoded], @Decoded AS [Decoded] 
 DECLARE @source varbinary(max), @encoded_base64 varchar(max), @decoded varbinary(max) SET @source = CONVERT(varbinary(max), 'welcome') -- Convert from varbinary to base64 string SET @encoded_base64 = CAST(N'' AS xml).value('xs:base64Binary(sql:variable ("@source"))', 'varchar(max)') -- Convert back from base64 to varbinary SET @decoded = CAST(N'' AS xml).value('xs:base64Binary(sql:variable ("@encoded_base64"))', 'varbinary(max)') SELECT CONVERT(varchar(max), @source) AS [Source varchar], @source AS [Source varbinary], @encoded_base64 AS [Encoded base64], @decoded AS [Decoded varbinary], CONVERT(varchar(max), @decoded) AS [Decoded varchar] 

Esto es útil para codificar y decodificar.

Por Bharat J

Hice un script para convertir un hash existente codificado en base64 a decimal, puede ser útil:

 SELECT LOWER(SUBSTRING(CONVERT(NVARCHAR(42), CAST( [COLUMN_NAME] as XML ).value('.','varbinary(max)'), 1), 3, 40)) from TABLE