2016-03-03 23 views
5

Tôi đang làm việc trên SQL Server và cố tạo một khóa kết hợp dữ liệu từ các cột bigintstring. Để giảm thiểu kích thước của bigint's được thể hiện dưới dạng chuỗi, tôi đang sử dụng mã hóa Base 64. Vấn đề là kết quả bao gồm hàng đầu 'A nghĩa là base64 số không và nó làm tăng kích thước của trường kết quả. Cách để xóa các số A hàng đầu này bằng cách sử dụng T-SQL hoặc XQuery?Máy chủ SQL: cách xóa hàng đầu 'A's từ chuỗi base64

Mẫu mã:

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

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

tôi có một kết quả AAAAew== nơi tôi muốn để xem chỉ ew vì ý tưởng là làm cho chuỗi thức càng ngắn càng nó càng tốt và base64 chuỗi nên ngắn hơn base10 .

cập nhật 1: như đã được đề xuất bởi Richard Boyce tôi đã cố gắng để chuyển đổi bigint vào chuỗi bằng nhau, nhưng nó mang lại null như một kết quả của việc chuyển đổi 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)') 

cập nhật 2: các giải pháp hiện tại là lấy chuỗi base64binary và loại bỏ hàng đầu 'A's và trailing' = 's. Nó không hoàn hảo, vì vậy bất kỳ đề xuất được chào đón. mã thực tế:

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

thay đổi "cast (cast (@input như varbinary (max)) như varchar (max)) "để" cast (cast (@input như varchar (max)) như varbinary (max)) " –

+0

vẫn còn có 'null'. Câu hỏi đặt ra là khi 123 được chuyển thành một chuỗi, phải mất ba ký tự để biểu diễn kết quả vì nó là 10 dựa trên. Và khi chuyển đổi thành base64, nó chỉ mất hai ký tự. Vì vậy, nó cần được chuyển đổi theo cách này: bigint-> binary-> base64 string –

Trả lời

1

Không muốn để lại một câu trả lời mà không trả lời câu hỏi, đây là cách để loại bỏ một số lãnh đạo của một từ một chuỗi (nhưng câu trả lời @ Richard cho là tốt hơn):

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

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

Cảm ơn câu trả lời, nhưng sử dụng hoạt động đệ quy có vẻ tốn thời gian ở đây. Tôi đang cố gắng tìm một cách để tránh thêm những 'A's vào đầu chuỗi base64 hoặc ít nhất để xóa chúng mà không cần đệ quy –

+0

Thực ra' A 'trong base64 có nghĩa là số không,' B '- 1 và cứ thế. Vì vậy, base64 'ABA' có nghĩa là 64 và 'BA' - quá. Xem https://en.wikipedia.org/wiki/Base64 –

+0

Mã này có vẻ dễ hơn một chút: chọn thay thế (ltrim (thay thế (@ val, 'A', '')), '', 'A') –

2

Thay vì cố gắng xóa "A" hàng đầu khỏi kết quả được mã hóa, hãy xem xét ngăn chúng ở vị trí đầu tiên.

Bạn cần chuyển đổi số của mình thành chuỗi trước khi mã hóa.

Hãy thử điều này

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

Lưu ý rằng khi mã hóa "123" trở thành "MTIz" không ew ==

+0

Ah, * bây giờ * Tôi thấy những gì @Viacheslav đang hỏi (Tôi phải có một ngày ngớ ngẩn!) Tất nhiên, AAAA không phải là lớp đệm Base64, dấu '=' là, chữ A chỉ là số 0 đứng đầu được mã hóa. Doh! Nice, đơn giản, câu trả lời. –

+0

Vấn đề là chuỗi '123' lớn hơn 123 số nguyên. –

+0

Tôi đã cố gắng tạo chuỗi bingint-> binary-> làm nguồn cho chuyển đổi base64, nhưng nó cho null –

Các vấn đề liên quan