2016-03-03 71 views
5

我正在SQL Server上的,并试图建立一个单一的钥匙从bigintstring列的数据组合。为了最小化表示为字符串的bigint's的大小,我使用Base 64编码。问题是结果包括领先'A的含义base64零,它增加了结果字段的大小。使用T-SQLXQuery删除这些领先A的方法是什么?SQL服务器:如何删除领先“的base64从字符串

示例代码:

DECLARE @binInput VARBINARY(MAX) 
SET @binInput = CAST(123 AS VARBINARY(MAX)) 

SELECT CAST(N'' AS XML).value('xs:base64Binary(sql:variable("@binInput"))', 'varchar(max)') 

我有一个导致AAAAew==,我更愿意看到的只是ew的想法,因为是使最终的字符串越短,可以和的base64字符串应该比base10更短。

更新1:如由理查德博伊斯建议我试图BIGINT转换为等于串,但它给空为base64转换的结果

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)') 

更新2:当前解决方案是得到一个base64二进制字符串,并删除前导'A和尾部'='s。这并不完美,所以我们欢迎任何建议。实际代码:

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 
+0

变化“CAST(CAST(@input为varbinary(MAX))为varchar(最大值) )“to”cast(cast(@input as varchar(max))as varbinary(max))“ –

+0

结果仍然为'null'。问题是,当123被转换为一个字符串时,需要三个字符来表示结果,因为它基于10。当将其转换为base64时,它只需要两个字符。所以它应该这样转换:bigint-> binary-> base64字符串 –

回答

1

不想要离开一个答案,不回答这个问题,这里是如何从一个字符串中删除多项领先A的(但@Richard给出的答案是更好):

DECLARE @VAL NVARCHAR(MAX) = N'AAAA12345ABCD9876==' 
SELECT SUBSTRING(@VAL,PATINDEX('%[^A]%',@VAL), LEN(@VAL)) 

---------------- 
12345ABCD9876== 
+0

感谢您的答案,但使用递归操作似乎在这里很费时。我试图找到一种方法来避免添加这些“在以base64字符串的开头A或至少不递归 –

+0

其实要删除这些‘A’用base64意味着零,‘B’ - 1等。所以base64'ABA'意思是64和'BA' - 也是。请参阅https://en.wikipedia.org/wiki/Base64 –

+0

此代码似乎更容易一些:select replace(ltrim(replace(@ val,'A','')),'','A') –

2

而不是试图删除防止他们摆在首位领先“A公司”,从编码结果的样子。

您需要在编码之前到你的电话号码转换为字符串。

试试这个

DECLARE @binInput VARBINARY(MAX) 
SET @binInput = CAST(CAST(123 AS VARCHAR(MAX)) AS VARBINARY(MAX)) 

DECLARE @Result VARCHAR(MAX) 

SELECT @Result = CAST(N'' AS XML).value('xs:base64Binary(sql:variable("@binInput"))', 'varchar(max)') 

SELECT CAST(CAST(N'' AS XML).value('xs:base64Binary(sql:variable("@Result"))', 'varbinary(max)') AS VARCHAR(MAX)) 

注意,在编码时 “123” 变成 “MTIz” 不EW ==

+0

啊,*现在*我看到@Viacheslav是问(我必须有一个愚蠢的一天!)当然,AAAA不是Base64的填充,最后的“=”是,A公司只是前导零编码。卫生署!很好,很简单,回答。 –

+0

问题是'123'字符串的方式比123整数大。 –

+0

我试图让bingint->二进制>字符串作为base64相互转换的来源,但它给空 –