सवाल यह जांचने के लिए कि कोई स्ट्रिंग एक अद्वितीय पहचानकर्ता है या नहीं?


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

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

जिस परिदृश्य को मैं कवर करने की कोशिश कर रहा हूं वह निम्न है:

SELECT something FROM table WHERE IsUniqueidentifier(column) = 1

44
2018-01-10 17:00


मूल


मैं समझ नहीं पा रहा हूं कि आप क्या हासिल करने की कोशिश कर रहे हैं। आप उन सभी पंक्तियों का चयन करना चाहते हैं जहां एक निश्चित कॉलम का मान एक अद्वितीय पहचानकर्ता है? व्यापार परिदृश्य क्या है? और यदि कोई कॉलम एक अनोखा पहचानकर्ता रखने के लिए है, तो क्या इसका मूल्य या तो शून्य या वास्तव में एक अद्वितीय पहचानकर्ता नहीं होगा? यह और क्या हो सकता है? - Jacob Mattison
मैं नामों के लिए ग्रिड का उपयोग कर डेटाबेस बना रहा हूं (बिल्ड सर्वर पर एकीकरण परीक्षण)। मैं उन डेटाबेस को सूचीबद्ध करना चाहता था (sys.databases से * चुनें * जहां IsUniqueidentifier (नाम)) - Benoittr
आह, समझ गया - आप का मतलब नहीं है अनोखा पहचानकर्ता डेटाटाइप, बस एक स्ट्रिंग। - Jacob Mattison


जवाब:


एसक्यूएल सर्वर 2012 यह सब बहुत आसान बनाता है TRY_CONVERT(UNIQUEIDENTIFIER, expression)

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

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

एसक्यूएल सर्वर या तो लपेटा GUIDs स्वीकार करता है {} या इसके बिना।

इसके अतिरिक्त यह स्ट्रिंग के अंत में अपरिवर्तनीय वर्णों को अनदेखा करता है। दोनों 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]' मिलान करने वाले पात्रों को समाप्त कर देगा À या Ë

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

तो (उधार लेना @ r0d30b0y का विचार) थोड़ा और मजबूत संस्करण हो सकता है

;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 + '}%' 

44
2017-10-02 16:49



एसक्यूएल सर्वर 2012 के बाद से मेरे मूल प्रश्न को ठीक से संबोधित करने के बाद इस उत्तर को स्वीकार किया गया है। - Benoittr
बस उन क्षणों में से एक था जो मेरे दिन बने स्टैक ओवरव्लो पर एक जवाब देख रहे थे। किसी भी तरह से मैंने नहीं देखा कि TRY_CONVERT अस्तित्व में था। - John Rose
वहाँ भी TRY_CAST अगर आपको स्टाइल तर्क की आवश्यकता नहीं है। TRY_PARSE समर्थन नहीं करता uniqueidentifier इसलिए इसे विचार करने की आवश्यकता नहीं है। - Trisped
TRY_CONVERT के लिए अपवृत। इस तरह की उत्कृष्टता के बारे में नहीं पता था। सर्वर को बहुत खराब है मुझे इसकी आवश्यकता है SQL Server 2008 है। - John Zabroski


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

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

53
2018-03-06 03:06



अच्छा है, हालांकि वे सभी शून्य एक टाइपो की ओर ले जा सकते हैं जो ट्रैक करना मुश्किल है :)। आईएमएचओ, खाली विचार के प्रारूप को बीमा करने के आपके विचार पर थोड़ा सा सुधार सही है: SELECT 1 WHERE @StringToCompare LIKE Replace(Cast(Cast(0 AS BINARY) AS UNIQUEIDENTIFIER), '0', '[0-9a-fA-F]'); - Al Dass
यह वास्तव में कैसे काम करता है? - MAW74656


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]');

21
2018-01-11 11:20



आप इसे एक फ़ंक्शन में बदल सकते हैं, जैसे पीसीओआरई सुझाव देता है: Create FUNCTION [dbo].[IsAGuid] (@Data varchar(50)) RETURNS bit WITH SCHEMABINDING AS BEGIN return case when @Data 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 - andes


मुझे कुछ भी पता नहीं है जिसे आप "बॉक्स से बाहर" उपयोग कर सकते हैं - आपको इसे स्वयं लिखना होगा, मुझे डर है।

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


4
2018-01-10 17:08





R0d30b0y उत्तर का एक संस्करण स्ट्रिंग के भीतर खोजने के लिए PATINDEX का उपयोग करना है ...

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

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

HTH

डेव


2
2018-02-22 18:10





इसे सरल रखना पसंद है। एक GUID में चार है - इसमें भी, अगर केवल एक स्ट्रिंग है

कॉलम कहां '% -% -% -% -%'


2
2018-01-31 19:37



"मैंने 100-200 भूल गए-मुझे-ऑफ-कैंपस लगाया" मेरा पसंदीदा GUID है - buckminst


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

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!

*/

1
2017-10-15 19:06





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

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

1
2017-08-25 09:39





आप अपना यूडीएफ लिख सकते हैं। 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

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


0
2018-01-10 17:23



आपका काम सोचता है कि ------------------------------------ एक अद्वितीय पहचानकर्ता है;) - onedaywhen
आप इसे किसी दिन के जवाब के साथ जोड़ सकते हैं: Create FUNCTION [dbo].[IsAGuid] (@Data varchar(50)) RETURNS bit WITH SCHEMABINDING AS BEGIN return case when @Data 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 - andes


मैं उपयोग करता हूं :

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

0
2017-09-29 08:44