SQL Server 2012 gør det hele meget nemmere med TRY_CONVERT(UNIQUEIDENTIFIER, expression)
SELECT something
FROM your_table
WHERE TRY_CONVERT(UNIQUEIDENTIFIER, your_column) IS NOT NULL;
For tidligere versioner af SQL Server savner de eksisterende svar nogle få punkter, hvilket betyder, at de enten ikke matcher strenge, som SQL Server faktisk vil caste til UNIQUEIDENTIFIER
uden klage eller kan stadig ende med at forårsage ugyldige cast-fejl.
SQL Server accepterer GUID'er enten pakket ind i {}
eller uden dette.
Derudover ignorerer den uvedkommende tegn i slutningen af strengen. Både SELECT CAST('{5D944516-98E6-44C5-849F-9C277833C01B}ssssssssss' as uniqueidentifier)
og SELECT CAST('5D944516-98E6-44C5-849F-9C277833C01BXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' as uniqueidentifier)
lykkes for eksempel.
Under de fleste standardsorteringer er LIKE '[a-zA-Z0-9]'
vil ende med at matche tegn såsom À
eller Ë
Til sidst, hvis der castes rækker i et resultat til entydig identifikator, er det vigtigt at placere cast-forsøget i et case-udtryk, da castet kan forekomme, før rækkerne filtreres af WHERE
.
Så (låner @r0d30b0ys idé) kan en lidt mere robust version være
;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 + '}%'