Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Jak sprawdzić, czy ciąg jest unikalnym identyfikatorem?

SQL Server 2012 znacznie ułatwia to wszystko dzięki TRY_CONVERT(UNIQUEIDENTIFIER, expression)

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

W przypadku wcześniejszych wersji SQL Server w istniejących odpowiedziach brakuje kilku punktów, co oznacza, że ​​mogą albo nie pasować do ciągów, które SQL Server będzie w rzeczywistości rzutować na UNIQUEIDENTIFIER bez reklamacji lub może nadal powodować nieprawidłowe błędy rzutowania.

SQL Server akceptuje identyfikatory GUID opakowane w {} lub bez tego.

Dodatkowo ignoruje zbędne znaki na końcu ciągu. Oba SELECT CAST('{5D944516-98E6-44C5-849F-9C277833C01B}ssssssssss' as uniqueidentifier) i SELECT CAST('5D944516-98E6-44C5-849F-9C277833C01BXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' as uniqueidentifier) na przykład odnieść sukces.

W większości domyślnych sortowań LIKE '[a-zA-Z0-9]' zakończy się pasującymi znakami, takimi jak À lub Ë

Na koniec, jeśli rzutuje wiersze w wyniku na uniqueidentifier, ważne jest, aby umieścić próbę rzutowania w wyrażeniu case, ponieważ rzutowanie może nastąpić przed filtrowaniem wierszy przez WHERE .

Tak więc (pożyczając pomysł @r0d30b0y) nieco bardziej solidna wersja może być

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


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. TSQL Try / Catch w ramach transakcji lub odwrotnie?

  2. Jak zwrócić wyniki zapytania jako listę oddzieloną przecinkami w SQL Server — STRING_AGG()

  3. Jak wykonać wyzwalacz tylko po zaktualizowaniu określonej kolumny (SQL Server)

  4. Eksportuj dane tabeli z jednego serwera SQL do drugiego

  5. Wykonaj sp_msforeachdb w aplikacji Java