SQL Server 2012 gör det hela mycket enklare med TRY_CONVERT(UNIQUEIDENTIFIER, expression)
SELECT something
FROM your_table
WHERE TRY_CONVERT(UNIQUEIDENTIFIER, your_column) IS NOT NULL;
För tidigare versioner av SQL Server missar de befintliga svaren några punkter som betyder att de antingen inte matchar strängar som SQL Server faktiskt kommer att casta till UNIQUEIDENTIFIER
utan klagomål eller kan fortfarande orsaka ogiltiga cast-fel.
SQL Server accepterar GUID antingen inslagna i {}
eller utan detta.
Dessutom ignorerar den främmande tecken i slutet av strängen. Båda SELECT CAST('{5D944516-98E6-44C5-849F-9C277833C01B}ssssssssss' as uniqueidentifier)
och SELECT CAST('5D944516-98E6-44C5-849F-9C277833C01BXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' as uniqueidentifier)
lyckas till exempel.
Under de flesta standardsammanställningar visas LIKE '[a-zA-Z0-9]'
kommer att matcha tecken som À
eller Ë
Slutligen, om du castar rader i ett resultat till en unik identifierare är det viktigt att placera castförsöket i ett case-uttryck eftersom casten kan inträffa innan raderna filtreras av WHERE
.
Så (lånar @r0d30b0ys idé) kan en lite mer robust version vara
;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 + '}%'