SQL Server 2012 делает все это намного проще с TRY_CONVERT(UNIQUEIDENTIFIER, expression)
SELECT something
FROM your_table
WHERE TRY_CONVERT(UNIQUEIDENTIFIER, your_column) IS NOT NULL;
В предыдущих версиях SQL Server в существующих ответах пропущено несколько моментов, которые означают, что они могут либо не совпадать со строками, которые SQL Server на самом деле приводит к UNIQUEIDENTIFIER
без жалоб, либо по-прежнему приводить к ошибкам приведения.
SQL Server принимает идентификаторы GUID, заключенные в {}
или без него.
Кроме того, он игнорирует посторонние символы в конце строки. Например, SELECT CAST('{5D944516-98E6-44C5-849F-9C277833C01B}ssssssssss' as uniqueidentifier)
и SELECT CAST('5D944516-98E6-44C5-849F-9C277833C01BXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' as uniqueidentifier)
успешны.
В большинстве параметров сортировки по умолчанию LIKE '[a-zA-Z0-9]'
в конечном итоге совпадает с такими символами, как À
или Ë
Наконец, если приведение строк в результате к уникальному идентификатору важно поместить попытку приведения в выражение case, так как приведение может произойти до того, как строки будут отфильтрованы с помощью WHERE
.
Итак (заимствуя @ r0d30b0y идею ), немного более надежная версия может быть
;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 + '}%'