2011-01-10 10 views
41

क्या अद्वितीय पहचानकर्ता (SQL सर्वर) के लिए IsDate या IsNumeric के बराबर है? या क्या कुछ भी है (सी #) TryParse?यह जांचने के लिए कि कोई स्ट्रिंग एक अद्वितीय पहचानकर्ता है या नहीं?

अन्यथा मुझे अपना स्वयं का फ़ंक्शन लिखना होगा, लेकिन मैं यह सुनिश्चित करना चाहता हूं कि मैं पहिया को पुनर्निर्मित नहीं कर रहा हूं। - आप अपने दम पर यह लिख करना होगा

SELECT something FROM table WHERE IsUniqueidentifier(column) = 1 
+1

मुझे समझ नहीं आता कि तुम क्या कर रहे हैं हासिल करने की कोशिश कर रहा है। आप उन सभी पंक्तियों का चयन करना चाहते हैं जहां एक निश्चित कॉलम का मान एक अद्वितीय पहचानकर्ता है? व्यापार परिदृश्य क्या है? और यदि कोई कॉलम एक अनोखा पहचानकर्ता रखने के लिए है, तो क्या इसका मूल्य या तो शून्य या वास्तव में एक अद्वितीय पहचानकर्ता नहीं होगा? यह और क्या हो सकता है? –

+0

मैं नामों के लिए गाइड (बिल्ड सर्वर पर एकीकरण परीक्षण) का उपयोग कर डेटाबेस बना रहा हूं। मैं उन डेटाबेसों को सूचीबद्ध करना चाहता था (sys.databases से चुनें * जहां IsUniqueidentifier (नाम)) – Benoittr

+0

आह, समझ गया - आप का मतलब यह नहीं है कि अद्वितीय पहचानकर्ता डेटाटाइप, केवल एक स्ट्रिंग है। –

उत्तर

38

SQL सर्वर 2012 इस सब बहुत आसान TRY_CONVERT(UNIQUEIDENTIFIER, expression)

SELECT something 
FROM your_table 
WHERE TRY_CONVERT(UNIQUEIDENTIFIER, your_column) IS NOT NULL; 

एसक्यूएल सर्वर के पूर्व संस्करण के लिए के साथ, मौजूदा जवाब कुछ बिंदुओं का मतलब है कि वे या तो तार से मेल नहीं हो सकता है कि एसक्यूएल सर्वर होगा याद आती है बनाता है वास्तव में शिकायत के बिना UNIQUEIDENTIFIER पर डाला गया या अभी भी अवैध कास्ट त्रुटियों के कारण समाप्त हो सकता है।

SQL सर्वर GUID को या तो {} में लपेटता है या इसके बिना स्वीकार करता है।

इसके अतिरिक्त यह स्ट्रिंग के अंत में अपर्याप्त वर्णों को अनदेखा करता है। उदाहरण के लिए SELECT CAST('{5D944516-98E6-44C5-849F-9C277833C01B}ssssssssss' as uniqueidentifier) और SELECT CAST('5D944516-98E6-44C5-849F-9C277833C01BXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' as uniqueidentifier) दोनों सफल हुए।

सबसे डिफ़ॉल्ट collations के तहत

LIKE '[a-zA-Z0-9]' वर्ण मिलान खत्म हो जाएगा जैसे À या Ë

अंत में अगर एक परिणाम में पंक्तियों कास्टिंग यह एक मामले अभिव्यक्ति में डाली प्रयास डाल करने के लिए के रूप में कास्ट हो सकती है महत्वपूर्ण है uniqueidentifier को WHERE द्वारा पंक्तियों को फ़िल्टर करने से पहले।

तो (उधार @r0d30b0y's idea) एक थोड़ा और अधिक मजबूत संस्करण हो सकता है

;WITH T(C) 
    AS (SELECT '5D944516-98E6-44C5-849F-9C277833C01B' 
     UNION ALL 
     SELECT '{5D944516-98E6-44C5-849F-9C277833C01B}' 
     UNION ALL 
     SELECT '5D944516-98E6-44C5-849F-9C277833C01BXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' 
     UNION ALL 
     SELECT '{5D944516-98E6-44C5-849F-9C277833C01B}ssssssssss' 
     UNION ALL 
     SELECT 'ÀD944516-98E6-44C5-849F-9C277833C01B' 
     UNION ALL 
     SELECT 'fish') 
SELECT CASE 
     WHEN C LIKE expression + '%' 
       OR C LIKE '{' + expression + '}%' THEN CAST(C AS UNIQUEIDENTIFIER) 
     END 
FROM T 
     CROSS APPLY (SELECT REPLACE('00000000-0000-0000-0000-000000000000', '0', '[0-9a-fA-F]') COLLATE Latin1_General_BIN) C2(expression) 
WHERE C LIKE expression + '%' 
     OR C LIKE '{' + expression + '}%' 
+0

के रूप में SQL Server 2012 के पते अपने मूल प्रश्न के बाद से स्वीकार किए जाते हैं बहुत अच्छी तरह से इस उत्तर को चिह्नित। – Benoittr

+4

सिर्फ उन क्षणों में से एक एक जवाब को देख रहे थे पर StackOverflow मेरा दिन बना दिया था। किसी तरह मैं TRY_CONVERT नहीं देखा था कि अस्तित्व। –

+2

वहाँ भी [ 'TRY_CAST'] (https://msdn.microsoft.com/en-us/library/hh974669.aspx) आप शैली तर्क की जरूरत नहीं है, तो। [ 'TRY_PARSE'] (https://msdn.microsoft.com/en-us/library/hh213126.aspx) support' नहीं है uniqueidentifier' पता है कि यह विचार करने की आवश्यकता नहीं है। TRY_CONVERT के लिए – Trisped

4

मैं कुछ भी है कि आप "बॉक्स से बाहर" इस्तेमाल कर सकते हैं के बारे में पता नहीं कर रहा हूँ:

परिदृश्य मैं कवर करने के लिए कोशिश कर रहा हूँ पीछा कर रहा है , मुझे डर लग रहा है।

यदि आप कर सकते हैं: इसे एक सी # लाइब्रेरी के अंदर लिखने की कोशिश करें और एसक्यूएल-सीएलआर असेंबली के रूप में इसे SQL सर्वर में तैनात करें - तो आप Guid.TryParse() जैसी चीजों का उपयोग कर सकते हैं जो टी-एसक्यूएल में किसी भी चीज़ से उपयोग करना निश्चित रूप से आसान है। ...

0

आप अपना खुद का यूडीएफ लिख सकते हैं। SQL-CLR असेंबली के उपयोग से बचने के लिए यह एक साधारण अनुमान है।

CREATE FUNCTION dbo.isuniqueidentifier (@ui varchar(50)) 
RETURNS bit AS 
BEGIN 

RETURN case when 
    substring(@ui,9,1)='-' and 
    substring(@ui,14,1)='-' and 
    substring(@ui,19,1)='-' and 
    substring(@ui,24,1)='-' and 
    len(@ui) = 36 then 1 else 0 end 

END 
GO 

फिर आप यह जांचने के लिए बेहतर कर सकते हैं कि यह केवल हेक्स मानों के बारे में है या नहीं।

+8

आपका कार्य सोचता है कि '------------------------------------' एक अद्वितीय पहचानकर्ता है;) – onedaywhen

+0

आप onedaywhen के जवाब के साथ इस गठबंधन कर सकते हैं:। 'फंक्शन [dbo] [IsAGuid] बनाएँ (@Data varchar (50)) को वापस SCHEMABINDING साथ बिट \t \t के रूप में की तरह शुरू \t \t \t वापसी मामले \t \t \t \t जब @Data ' [0-9a-एफए एफ] [0-9a-एफए एफ] [0-9a-एफए एफ] [0-9a-एफए एफ] [0-9a-एफए एफ] [0-9a- एफए एफ] [0-9a-एफए एफ] [0-9a-एफए एफ] - [0-9a-एफए एफ] [0-9a-एफए एफ] [0-9a-एफए एफ] [0-9a-एफए एफ] - [0-9a-एफए एफ] [0-9a-एफए एफ] [0-9a-एफए एफ] [0-9a-एफए एफ] - [0- 9a-एफए एफ] [0-9a-एफए एफ] [0-9a-एफए एफ] [0-9a-एफए एफ] - [0-9a-एफए एफ] [0-9a-fa- एफ] [0-9a-एफए एफ] [0-9a-एफए एफ] [0-9a-एफए एफ] [0-9a-एफए एफ] [0-9a-एफए एफ] [0- 9a-एफए एफ] [0-9a-एफए एफ] [0-9a-एफए एफ] [0-9a -fA-एफ] [0-9a-एफए एफ] ' \t \t \t तो \t \t \t बाकी \t 0 अंत \t \t END' – andes

21
SELECT something 
    FROM table1 
WHERE column1 LIKE '[0-9a-fA-F][0-9a-fA-F][0-9a-fA-F][0-9a-fA-F][0-9a-fA-F][0-9a-fA-F][0-9a-fA-F][0-9a-fA-F]-[0-9a-fA-F][0-9a-fA-F][0-9a-fA-F][0-9a-fA-F]-[0-9a-fA-F][0-9a-fA-F][0-9a-fA-F][0-9a-fA-F]-[0-9a-fA-F][0-9a-fA-F][0-9a-fA-F][0-9a-fA-F]-[0-9a-fA-F][0-9a-fA-F][0-9a-fA-F][0-9a-fA-F][0-9a-fA-F][0-9a-fA-F][0-9a-fA-F][0-9a-fA-F][0-9a-fA-F][0-9a-fA-F][0-9a-fA-F][0-9a-fA-F]'; 

अद्यतन:

... लेकिन मैं बहुत r0d30b0y @ द्वारा जवाब में दृष्टिकोण पसंद करते हैं:,

SELECT something 
    FROM table1 
WHERE column1 LIKE REPLACE('00000000-0000-0000-0000-000000000000', '0', '[0-9a-fA-F]'); 
+0

pcofre की तरह चलता है आप एक समारोह में इस बदल सकता है,: 'बनाएं समारोह [डीबीओ]।[IsAGuid] (@Data varchar (50)) SCHEMABINDING बिट के साथ लौटाने वाली शुरू \t \t \t \t \t घर लौटने \t \t \t \t जब @Data '[0-9a-एफए एफ] [जैसे 0-9a- एफए एफ] [0-9a-एफए एफ] [0-9a-एफए एफ] [0-9a-एफए एफ] [0-9a-एफए एफ] [0-9a-एफए एफ] [ 0-9a-एफए एफ] - [0-9a-एफए एफ] [0-9a-एफए एफ] [0-9a-एफए एफ] [0-9a-एफए एफ] - [0-9a -यह-एफ] [0-9a-एफए एफ] [0-9a-एफए एफ] [0-9a-एफए एफ] - [0-9a-एफए एफ] [0-9a-एफए एफ ] [0-9a-एफए एफ] [0-9a-एफए एफ] - [0-9a-एफए एफ] [0-9a-एफए एफ] [0-9a-एफए एफ] [0- 9a-एफए एफ] [0-9a-एफए एफ] [0-9a-एफए एफ] [0-9a-एफए एफ] [0-9a-एफए एफ] [0-9a-एफए एफ ] [0-9a-एफए एफ] [0-9a-एफए एफ] [0-9a-एफए एफ] ' \t \t \t तो \t \t \t बाकी 0 अंत \t \t END' – andes

51

मेरी नहीं इस ऑनलाइन पाया ... सोचा मैं साझा करते हैं ।

SELECT 1 WHERE @StringToCompare LIKE 
     REPLACE('00000000-0000-0000-0000-000000000000', '0', '[0-9a-fA-F]'); 
+3

अच्छा एक \t, हालांकि सभी उन शून्य लिखने में कोई त्रुटि है कि नीचे ट्रैक करने के लिए :) मुश्किल है हो सकता है। , 'का चयन करें 1 कहां @StringToCompare तरह बदलें (कास्ट (कास्ट (0 बाइनरी के रूप में) UniqueIdentifier के रूप में), '0' '[: IMHO, यहाँ अपने विचार खाली UniqueIdentifier के प्रारूप का बीमा करने पर एक मामूली सुधार सही है 0-9a-एफए एफ] '); –

+4

'वास्तव में किस प्रकार काम करता है? – MAW74656

2

r0d30b0y जवाब का एक प्रकार PATINDEX उपयोग करने के लिए एक स्ट्रिंग के भीतर मिल रहा है ...

PATINDEX('%'+REPLACE('00000000-0000-0000-0000-000000000000', '0', '[0-9a-fA-F]')+'%',@StringToCompare) > 0 

.. एक यूआरएल स्ट्रिंग के भीतर GUIDs को खोजने के लिए इस्तेमाल किया था

HTH

डेव

0

मैं का उपयोग करें:

ISNULL(convert(nvarchar(50), userID), 'NULL') = 'NULL' 
1

यह एक कार्य के आधार पर है कुछ पूर्व टिप्पणियों की अवधारणा। यह कार्य बहुत तेज है।

CREATE FUNCTION [dbo].[IsGuid] (@input varchar(50)) 
    RETURNS bit AS 
BEGIN 

RETURN 
    case when @input like '[0-9a-fA-F][0-9a-fA-F][0-9a-fA-F][0-9a-fA-F][0-9a-fA-F][0-9a-fA-F][0-9a-fA-F][0-9a-fA-F]-[0-9a-fA-F][0-9a-fA-F][0-9a-fA-F][0-9a-fA-F]-[0-9a-fA-F][0-9a-fA-F][0-9a-fA-F][0-9a-fA-F]-[0-9a-fA-F][0-9a-fA-F][0-9a-fA-F][0-9a-fA-F]-[0-9a-fA-F][0-9a-fA-F][0-9a-fA-F][0-9a-fA-F][0-9a-fA-F][0-9a-fA-F][0-9a-fA-F][0-9a-fA-F][0-9a-fA-F][0-9a-fA-F][0-9a-fA-F][0-9a-fA-F]' 
    then 1 else 0 end 
END 
GO 

/* 
Usage: 

select [dbo].[IsGuid]('123') -- Returns 0 
select [dbo].[IsGuid]('ebd8aebd-7ea3-439d-a7bc-e009dee0eae0') -- Returns 1 

select * from SomeTable where dbo.IsGuid(TableField) = 0 -- Returns table with all non convertable items! 

*/ 
2

इसे आसान रखना पसंद है। एक GUID चार है - यहां तक ​​कि उस में, अगर सिर्फ एक स्ट्रिंग है

जहां स्तंभ '% -% -% -% -%' की तरह

+0

"मैं लगाए 100-200 मत भूलना मुझे-वंचितों परिसर के बाहर" मेरे पसंदीदा GUID है – buckminst

0

मैं कुछ टेस्ट उपयोगकर्ताओं कि AutoFixture, जो GUIDs का उपयोग करता है के साथ उत्पन्न किया गया था जेनरेट किए गए फ़ील्ड के लिए डिफ़ॉल्ट रूप से। उन उपयोगकर्ताओं के लिए मेरा फर्स्टनाम फ़ील्ड जिन्हें मुझे हटाने की आवश्यकता है वे GUID या अद्वितीय पहचानकर्ता हैं। इस तरह मैं यहां समाप्त हुआ।

मैं इसमें आपके कुछ उत्तरों को एक साथ जोड़ने में सक्षम था।

SELECT UserId FROM [Membership].[UserInfo] Where TRY_CONVERT(uniqueidentifier, FirstName) is not null

1

एक पुराने पोस्ट, बस एक त्वरित परीक्षण के लिए एक विचार हालांकि ...

SELECT [A].[INPUT], 
     CAST([A].[INPUT] AS [UNIQUEIDENTIFIER]) 
FROM (
      SELECT '5D944516-98E6-44C5-849F-9C277833C01B' Collate Latin1_General_100_BIN AS [INPUT] 
      UNION ALL 
      SELECT '{5D944516-98E6-44C5-849F-9C277833C01B}' 
      UNION ALL 
      SELECT '5D944516-98E6-44C5-849F-9C277833C01BXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' 
      UNION ALL 
      SELECT '{5D944516-98E6-44C5-849F-9C277833C01B}ssssssssss' 
      UNION ALL 
      SELECT 'ÀD944516-98E6-44C5-849F-9C277833C01B' 
      UNION ALL 
      SELECT 'fish' 
     ) [A] 
WHERE PATINDEX('[^0-9A-F-{}]%', [A].[INPUT]) = 0 
0

उपयोग MYSQL

के लिए RLIKE
SELECT 1 WHERE @StringToCompare 
RLIKE REPLACE('00000000-0000-0000-0000-000000000000', '0', '[0-9a-fA-F]'); 
संबंधित मुद्दे

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