2016-03-03 11 views
5

से अग्रणी 'ए' को कैसे हटाएं मैं SQL सर्वर पर काम कर रहा हूं और bigint और string कॉलम से डेटा एकत्र करने की एक कुंजी बनाने की कोशिश कर रहा हूं। स्ट्रिंग्स के रूप में प्रतिनिधित्व bigint's के आकार को कम करने के लिए मैं बेस 64 एन्कोडिंग का उपयोग कर रहा हूं। समस्या यह है कि परिणाम में 'ए का अर्थ base64 शून्य शामिल है और यह परिणामी क्षेत्र का आकार बढ़ाता है। T-SQL या XQuery का उपयोग करके इन अग्रणी A को हटाने का तरीका क्या है?एसक्यूएल सर्वर: बेस 64 स्ट्रिंग

नमूना कोड:

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 परिवर्तित करने की कोशिश की है, लेकिन यह

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 बेस 64 रूपांतरण का एक परिणाम के रूप में अशक्त देता है: वर्तमान समाधान बेस 64 बाइनरी स्ट्रिंग प्राप्त करना और अग्रणी 'ए और पीछे' = 'को हटाने के लिए है। यह सही नहीं है, इसलिए किसी भी सुझाव का स्वागत है। वास्तविक कोड:

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

परिवर्तन "डाली (डाली (@input varbinary के रूप में (अधिकतम)))) "टू" कास्ट (कास्ट (वर्नर (अधिकतम) के रूप में @ इनपुट (var) के रूप में) " –

+0

परिणामस्वरूप अभी भी 'शून्य' है। सवाल यह था कि जब 123 को तारों में परिवर्तित किया जाता है तो परिणाम के प्रतिनिधित्व के लिए तीन वर्ण होते हैं क्योंकि यह 10 आधारित है। और जब इसे बेस 64 में परिवर्तित किया जाता है तो इसे केवल दो अक्षर लेना चाहिए। तो इसे इस तरह से परिवर्तित किया जाना चाहिए: bigint-> बाइनरी-> बेस 64 स्ट्रिंग –

उत्तर

1

एक जवाब इस सवाल का जवाब नहीं है छोड़ने के लिए इच्छुक नहीं है, यहाँ एक स्ट्रिंग से प्रमुख ए के के एक नंबर को निकालने का तरीका (लेकिन जवाब @Richard दिया बेहतर है):

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

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

उत्तर के लिए धन्यवाद, लेकिन रिकर्सिव ऑपरेशन का उपयोग करके यहां समय लेने वाला लगता है। मैं बेस 'स्ट्रिंग की शुरुआत में' ए 'को जोड़ने से बचने के लिए एक रास्ता खोजने का प्रयास कर रहा हूं या कम से कम उन्हें रिकर्सन के बिना हटाने के लिए –

+0

बेस 64 में वास्तव में' ए 'का अर्थ शून्य,' बी '- 1 और इसी तरह है। तो बेस 64 'एबीए' का अर्थ है 64 और 'बीए' - भी। Https://en.wikipedia.org/wiki/Base64 –

+0

यह कोड थोड़ा आसान लगता है: प्रतिस्थापित करें (ltrim (प्रतिस्थापित करें (@ val, 'ए', '')), '', 'ए') –

2

एन्कोडेड परिणाम से अग्रणी "ए" को हटाने की कोशिश करने की बजाय उन्हें पहले स्थान पर रोकने पर विचार करें।

आपको एन्कोडिंग से पहले अपनी संख्या को एक स्ट्रिंग में कनवर्ट करने की आवश्यकता है।

प्रयास करें इस

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" varchar (max के रूप में हो जाता है "MTIz" नहीं ew ==

+0

आह, * अब * मैं देखता हूं कि @ वीचस्लाव क्या पूछ रहा है (मुझे एक गूंगा दिन होना चाहिए!) बेशक, एएएए बेस 64 पैडिंग नहीं है, पिछला '=' है, ए केवल एन्कोडेड प्रमुख शून्य हैं। रवींद्र! अच्छा, सरल, जवाब। –

+0

समस्या यह है कि '123' स्ट्रिंग 123 पूर्णांक से बड़ा तरीका है। –

+0

मैंने बेस 64 रूपांतरण के लिए स्रोत के रूप में bingint-> बाइनरी-> स्ट्रिंग बनाने की कोशिश की, लेकिन यह शून्य –

संबंधित मुद्दे