2016-03-03 78 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相互轉換的來源,但它給空 –