SQL Server 2012 sprawia, że to wszystko o wiele łatwiej z TRY_CONVERT(UNIQUEIDENTIFIER, expression)
SELECT something
FROM your_table
WHERE TRY_CONVERT(UNIQUEIDENTIFIER, your_column) IS NOT NULL;
Na wcześniejszych wersjach SQL Server, istniejące odpowiedzi przegap kilka punktów, które oznaczają mogą albo nie pasuje do ciągów SQL Server w rzeczywistości odlewane do UNIQUEIDENTIFIER
bez reklamacji lub nadal mogą skutkować nieprawidłowymi błędami rzutu.
Serwer SQL akceptuje identyfikatory GUID zapakowane w {}
lub bez tego.
Dodatkowo ignoruje nieistotne znaki na końcu łańcucha. Zarówno SELECT CAST('{5D944516-98E6-44C5-849F-9C277833C01B}ssssssssss' as uniqueidentifier)
, jak i SELECT CAST('5D944516-98E6-44C5-849F-9C277833C01BXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' as uniqueidentifier)
odnoszą sukces na przykład.
W większości domyślnych ustawień sortowania LIKE '[a-zA-Z0-9]'
skończy się pasujące znaki takie jak À
lub Ë
Wreszcie jeśli odlewania wierszy w rezultacie do uniqueidentifier ważne jest, aby umieścić próbę rzucania w sprawie wyrażenia, jakie mogą pojawić się obsada zanim wiersze zostaną przefiltrowane przez WHERE
.
Tak (pożyczanie @r0d30b0y's idea) nieco bardziej wytrzymała 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 + '}%'
Nie rozumiem co masz próbując osiągnąć. Chcesz zaznaczyć wszystkie wiersze, w których wartość dla konkretnej kolumny jest unikalnym identyfikatorem? Jaki scenariusz biznesowy? A jeśli kolumna ma zawierać unikatowy identyfikator, czy jego wartość nie będzie miała wartości zerowej, czy też będzie unikalnym identyfikatorem? Cóż innego mogło być? –
Tworzę bazy danych przy użyciu identyfikatorów dla nazw (testy integracyjne na serwerze kompilacji). Chciałem wymienić te bazy danych (wybierz * z sys.databases gdzie IsUniqueidentifier (name)) – Benoittr
Ach, rozumiem - nie masz na myśli unikalnego typu danych, tylko ciąg znaków. –