SQL सर्वर में varchar को uniqueidentifier में कन्वर्ट करें


104

मेरे पास तालिका के लिए स्कीमा का कोई नियंत्रण नहीं है, इसमें एक स्तंभ है जिसे varchar (50) के रूप में परिभाषित किया गया है, जो 'a89b1acd95016ae6b9c8aabb07da2010' (कोई हाइफ़न) प्रारूप में अद्वितीय पहचानकर्ताओं को संग्रहीत करता है।

मैं .net गाइड में पास करने के लिए इनको यूनिकोडिफायर में SQL में बदलना चाहता हूं। हालाँकि, निम्न क्वेरी लाइनें मेरे लिए काम नहीं करती हैं:

select cast('a89b1acd95016ae6b9c8aabb07da2010' as uniqueidentifier)
select convert(uniqueidentifier, 'a89b1acd95016ae6b9c8aabb07da2010')

और परिणाम:

Msg 8169, स्तर 16, राज्य 2, पंक्ति 1
एक चरित्र स्ट्रिंग से अनूठे पहचानकर्ता में परिवर्तित करते समय रूपांतरण विफल रहा।

हाइफ़ननेटेड यूनिकफीडिफायर का उपयोग करने वाले समान प्रश्न ठीक काम करते हैं लेकिन डेटा उस प्रारूप में संग्रहीत नहीं होता है।

क्या इन स्ट्रिंग्स को SQL में यूनीकॉलीफायर्स में बदलने का एक और (कुशल) तरीका है। - मैं इसे .Net कोड में नहीं करना चाहता।


सिर्फ पात्रों और संख्याओं की एक पंक्ति वास्तव में एक वैध GUID प्रतिनिधित्व नहीं है - आपको अपने जवाब में दिखाए गए क्रासिंग जादू का सहारा लेना होगा।
marc_s

जवाबों:


126
DECLARE @uuid VARCHAR(50)
SET @uuid = 'a89b1acd95016ae6b9c8aabb07da2010'
SELECT  CAST(
        SUBSTRING(@uuid, 1, 8) + '-' + SUBSTRING(@uuid, 9, 4) + '-' + SUBSTRING(@uuid, 13, 4) + '-' +
        SUBSTRING(@uuid, 17, 4) + '-' + SUBSTRING(@uuid, 21, 12)
        AS UNIQUEIDENTIFIER)

10
मैं वास्तव में उम्मीद कर रहा था कि यह समाधान नहीं होगा, लेकिन मुझे लगता है कि हम जल्द ही इसका पता लगा लेंगे ...
ग्रेनेड

22
DECLARE @u यूनिकॉलीफ़ायर सेलेक्ट @u = CONVERT (अनूठे पहचानकर्ता, 'c029f8be-29dc-41c1-8b38-737b4cc5a4df') *** यह पर्याप्त होगा। बस कोशिश की।
फैबियो मिल्हीरो

अरे हाँ! तब मुझे सहमत होना पड़ेगा। स्पष्ट बात यह है कि हाइफ़न को सही स्थानों पर रखना है और आप जाने के लिए तैयार हैं! माफ़ करना!
फाबियो मिल्हीरो

इस स्निपेट को एक फंक्शन में रखना आपके टूलकिट के लिए एक अच्छा जोड़ है, खासकर जब से कुछ JSON सीरियलाइज़र सीरीज़ करते समय GUID से डैश हटाते हैं, जिससे एसक्यूएल में पेस्ट को डीबग करना मुश्किल हो जाता है।
डेविड

27

यह एक आसान कार्य के लिए करना होगा। इसके अलावा, नोट करें कि मैं SUBSTRING के बजाय STUFF का उपयोग कर रहा हूं।

create function str2uniq(@s varchar(50)) returns uniqueidentifier as begin
    -- just in case it came in with 0x prefix or dashes...
    set @s = replace(replace(@s,'0x',''),'-','')
    -- inject dashes in the right places
    set @s = stuff(stuff(stuff(stuff(@s,21,0,'-'),17,0,'-'),13,0,'-'),9,0,'-')
    return cast(@s as uniqueidentifier)
end

4
सामग्री का उत्कृष्ट उपयोग ()। मुझे केवल आपकी विधि का उपयोग करके एक बार अपने चयन क्षेत्र में संदर्भ देने की आवश्यकता है। मैं स्केलर-फ़ंक्शंस से बचता हूं, क्योंकि वे हमेशा अच्छी तरह से "स्केल" नहीं करते हैं, इसलिए मैं इसे लिखता हूं। धन्यवाद, यह मेरे कोड स्निपिट्स में जा रहा है!
माइकटीवई

18

आपका varchar col C:

SELECT CONVERT(uniqueidentifier,LEFT(C, 8)
                                + '-' +RIGHT(LEFT(C, 12), 4)
                                + '-' +RIGHT(LEFT(C, 16), 4)
                                + '-' +RIGHT(LEFT(C, 20), 4)
                                + '-' +RIGHT(C, 12))


-4

यदि आपके स्ट्रिंग में विशेष वर्ण हैं, तो आप इसे md5 पर रख सकते हैं और फिर इसे एक मार्गदर्शक / अद्वितीय पहचानकर्ता में बदल सकते हैं।

SELECT CONVERT(UNIQUEIDENTIFIER, HASHBYTES('MD5','~öü߀a89b1acd95016ae6b9c8aabb07da2010'))

8
यह इनपुट स्ट्रिंग को पूरी तरह से अलग GUID
आरोनिनस

-6

प्रदान की गई गाइड सही प्रारूप (.net प्रोवाइड गाइड) नहीं है।

begin try
select convert(uniqueidentifier,'a89b1acd95016ae6b9c8aabb07da2010')
end try
begin catch
print '1'
end catch

6
यह कैसे एक varchar को हाइफ़न के बिना GUID में परिवर्तित करने के प्रश्न का उत्तर देता है? यह सब कोड प्रिंट 1 है
एरोनिनस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.