SQL Server 2005 T-SQL中的Base64编码
我想编写一个T-SQL查询,我将其编码为Base64string。 令人惊讶的是,我找不到用于执行Base64编码的任何本地T-SQL函数。 本地函数是否存在? 如果没有,那么在T-SQL中进行Base64编码的最好方法是什么?
我知道这已经被回答了,但是我只是花了很多时间而不是承认单线SQL语句来完成这个任务,所以我会在这里分享它们,以防其他人需要这样做:
-- 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 ;
我不得不在第一个(编码)查询中使用子查询生成的表,因为我找不到任何方法将原始值(“TestData”)转换为其hexstring表示forms(“5465737444617461”)以包含作为参数xs:hexBinary()在XQuery语句中。
我希望这可以帮助别人!
对于SQL Server 2012及更高版本,我可以find的最简单和最简单的方法是BINARY BASE64
:
SELECT CAST('string' as varbinary(max)) FOR XML PATH(''), BINARY BASE64
为Base64进行string
SELECT CAST( CAST( 'c3RyaW5n' as XML ).value('.','varbinary(max)') AS varchar(max) )
(或Unicodestring的nvarchar(max)
)
以下是对mercurial解码器上子查询的解答的修改,允许在两个实例中使用variables。
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
以下是将执行这些工作的函数的代码
-- 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
不,没有本地function,这个方法在过去一直为我工作: http : //www.motobit.com/help/scptutl/sa306.htm
所以有这个方法:
http://www.vbforums.com/showthread.php?t=554886
我喜欢@ Slai的回答。 我只需要对我所寻找的单线进行非常小的修改。 我想我会分享我最终的结果,以防止其他人像我一样绊倒在这个页面上:
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]
这对于编码和解码是有用的。
由巴拉特J