SQL Server 2012 hace todo esto mucho más fácil con TRY_CONVERT(UNIQUEIDENTIFIER, expression)
SELECT something
FROM your_table
WHERE TRY_CONVERT(UNIQUEIDENTIFIER, your_column) IS NOT NULL;
Para versiones anteriores de SQL Server, las respuestas existentes pierden algunos puntos que significan que es posible que no coincidan con las cadenas que SQL Server de hecho convertirá en UNIQUEIDENTIFIER
sin quejarse o aún puede terminar causando errores de conversión no válidos.
SQL Server acepta GUID envueltos en {}
o sin esto.
Además, ignora los caracteres extraños al final de la cadena. Ambos SELECT CAST('{5D944516-98E6-44C5-849F-9C277833C01B}ssssssssss' as uniqueidentifier)
y SELECT CAST('5D944516-98E6-44C5-849F-9C277833C01BXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' as uniqueidentifier)
tener éxito, por ejemplo.
En la mayoría de intercalaciones predeterminadas, LIKE '[a-zA-Z0-9]'
terminará haciendo coincidir caracteres como À
o Ë
Finalmente, si convierte filas en un resultado a un identificador único, es importante poner el intento de conversión en una expresión de caso, ya que la conversión puede ocurrir antes de que las filas sean filtradas por WHERE
.
Entonces (tomando prestada la idea de @ r0d30b0y) una versión un poco más robusta podría ser
;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 + '}%'