sql >> Base de Datos >  >> RDS >> Sqlserver

¿Cómo verificar si una cadena es un identificador único?

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 + '}%'