Soru Bir dizenin benzersiz bir tanımlayıcı olup olmadığı nasıl kontrol edilir?


Eşsiz belirleyici (SQL Server) için IsDate veya IsNumeric'e eşdeğer var mı? Veya (C #) TryParse ile eşdeğer bir şey var mı?

Aksi takdirde kendi işlevimi yazmam gerekecek, fakat ben tekerleği yeniden icat etmediğime emin olmak istiyorum.

Gizlemeye çalıştığım senaryo şudur:

SELECT something FROM table WHERE IsUniqueidentifier(column) = 1

44
2018-01-10 17:00


Menşei


Neyi başarmaya çalıştığını anlamıyorum. Belirli bir sütunun değerinin benzersiz bir tanımlayıcı olduğu tüm satırları seçmek ister misiniz? İş senaryosu nedir? Ve eğer bir sütun benzersiz bir belirleyiciyi elinde bulundurmak isteniyorsa, onun değeri ya null ya da gerçek bir tanımlayıcı olmaz mı? Başka ne olabilir ki? - Jacob Mattison
İsimler için kılavuzlar kullanarak veri tabanları oluşturuyorum (sunucuda entegrasyon testleri). Bu veritabanlarını listelemek istedim (IsUniqueidentifier'ın (isim) olduğu sys.databases'ten * seçin) - Benoittr
Ah, anladım - benzersiz tanımlayıcı veri türünü kastetmiyorsun, sadece bir ip. - Jacob Mattison


Cevaplar:


SQL Server 2012 bunu çok daha kolay hale getiriyor TRY_CONVERT(UNIQUEIDENTIFIER, expression)

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

SQL Server'ın önceki sürümlerinde, varolan yanıtlar, SQL Server'ın gerçekten de UNIQUEIDENTIFIER şikayetsiz veya geçersiz döküm hatalarına neden olabilir.

SQL Server, ya sarılmış GUID'leri kabul eder {} ya da bu olmadan.

Ayrıca dizenin sonunda yabancı karakterler yok sayar. Her ikisi de SELECT CAST('{5D944516-98E6-44C5-849F-9C277833C01B}ssssssssss' as uniqueidentifier) ve SELECT CAST('5D944516-98E6-44C5-849F-9C277833C01BXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' as uniqueidentifier) örneğin, başarılı olmak.

Çoğu varsayılan harmanlamanın altında LIKE '[a-zA-Z0-9]' gibi eşleşen karakterleri sona erecek À veya Ë

Sonuç olarak, satırları benzersiz belirleyiciye dönüştürürse, satırlar satırlar filtrelenmeden önce oluşabileceğinden, döküm girişimini bir vaka ifadesine koymak önemlidir. WHERE.

Yani (borç almak @ r0d30b0y'nin fikri) biraz daha sağlam bir versiyon olabilir

;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



SQL Server 2012, orijinal soruma oldukça iyi yanıt verdiğinden bu yanıtı kabul edildi olarak işaretlendi. - Benoittr
Sadece o anlardan biri StackOverflow'a bir cevap görüyordu günümü yaptı. Her nasılsa TRY_CONVERT var olduğunu görmedim. - John Rose
Ayrıca birde şu var TRY_CAST stil argümanına ihtiyacınız yoksa. TRY_PARSE Desteklemiyor uniqueidentifier bu yüzden dikkate alınması gerekmez. - Trisped
TRY_CONVERT için ayrıldı. Böyle berbatlık hakkında bilmiyordum. Çok fazla ihtiyacım olan sunucu SQL Server 2008. - John Zabroski


Benim değil, bunu çevrimiçi buldum ... paylaşacağımı düşündüm.

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

53
2018-03-06 03:06



Güzel olan, ancak tüm bu sıfırlar aşağı izlemek zor bir yazım hatası yol açabilir :). IMHO, burada boş UNIQUEIDENTIFIER formatının doğruluğunu garanti eden fikrinizde ufak bir gelişme var: SELECT 1 WHERE @StringToCompare LIKE Replace(Cast(Cast(0 AS BINARY) AS UNIQUEIDENTIFIER), '0', '[0-9a-fA-F]'); - Al Dass
Tam olarak nasıl çalışır? - 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]';

GÜNCELLEŞTİRME:

... ama yanıtı @ r0d30b0y ile tercih ediyorum:

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

21
2018-01-11 11:20



Bunu, pcofre'nın önerdiği gibi bir işleve dönüştürebilirsiniz: 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


"Kutunun dışında" kullanabileceğin hiçbir şeyden haberdar değilim - bunu kendime yazman gerekecek, korkarım.

Şunları yapabilirsiniz: Bunu bir C # kütüphanesinde yazmayı deneyin ve bir SQL-CLR montajı olarak SQL Server'a dağıtın - o zaman Guid.TryParse() T-SQL'de her şeyden daha kullanımı çok daha kolay ....


4
2018-01-10 17:08





R0d30b0y cevabının bir varyantı, bir dizgede bulmak için PATINDEX kullanmaktır ...

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

Bir URL dizesi içinde Rehberleri bulmak için kullanmak zorunda kaldı ..

HTH

Dave


2
2018-02-22 18:10





Basit tutmak gibi. Bir GUID'de dört tane var - hatta bir dizgeyse

'% -% -% -% -%' gibi bir sütun var


2
2018-01-31 19:37



"100-200 unumun dışında kampüs dışında kaldım" en sevdiğim GUID'im - buckminst


Bu, bazı eski yorum kavramlarına dayanan bir işlevdir. Bu işlev çok hızlı.

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





Daha eski bir yazı olmasına rağmen, hızlı bir test için sadece bir düşünce ...

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