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