Via*_*dov 5 t-sql sql-server base64 xquery
我正在研究SQL Server并尝试创建一个组合来自bigint和string列的数据的单个键.为了最小化bigint's表示为字符串的大小我正在使用Base 64编码.问题是结果包括引导'A'意味着base64零并且它增加了结果字段的大小.A使用T-SQL或删除这些领先的方法是什么XQuery?
示例代码:
DECLARE @binInput VARBINARY(MAX)
SET @binInput = CAST(123 AS VARBINARY(MAX))
SELECT CAST(N'' AS XML).value('xs:base64Binary(sql:variable("@binInput"))', 'varchar(max)')
Run Code Online (Sandbox Code Playgroud)
我有一个结果AAAAew==,我宁愿看到只是ew因为这个想法是尽可能地使最后的字符串尽可能短,而base64字符串应该比base10短.
更新1:正如Richard Boyce所建议的那样我试图将bigint转换为相等的字符串,但由于base64转换它给出了null
declare @input bigint
declare @varInput nvarchar(max)
set @input = 123
set @varInput = cast(cast(@input as varbinary(max)) as varchar(max))
select CAST(N'' AS xml).value('xs:base64Binary(sql:variable("@varInput"))', 'varchar(max)')
Run Code Online (Sandbox Code Playgroud)
更新2:当前的解决方案是获取base64binary字符串并删除前导'A和尾随'='.它并不完美,所以欢迎任何建议.实际代码:
declare @input bigint
set @input = 1234567890
declare @output varchar(max)
set @output = (select cast(@input as varbinary(max)) for xml path(''),binary base64)
set @output = replace(ltrim(replace(@output,'A',' ')),' ','A') -- remove leading 'A's
set @output = replace(@output,'=','') -- remove trailing '='s
select @output
Run Code Online (Sandbox Code Playgroud)
不想留下无法回答问题的答案,以下是如何从字符串中删除多个前导 A(但 @Richard 给出的答案更好):
DECLARE @VAL NVARCHAR(MAX) = N'AAAA12345ABCD9876=='
SELECT SUBSTRING(@VAL,PATINDEX('%[^A]%',@VAL), LEN(@VAL))
----------------
12345ABCD9876==
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
353 次 |
| 最近记录: |