Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Como verificar se uma string é um identificador exclusivo?


O SQL Server 2012 torna tudo muito mais fácil com TRY_CONVERT(UNIQUEIDENTIFIER, expression)
SELECT something
FROM   your_table
WHERE  TRY_CONVERT(UNIQUEIDENTIFIER, your_column) IS NOT NULL;

Para versões anteriores do SQL Server, as respostas existentes perdem alguns pontos, o que significa que elas podem não corresponder às strings que o SQL Server de fato converterá em UNIQUEIDENTIFIER sem reclamação ou ainda pode acabar causando erros de cast inválido.

O SQL Server aceita GUIDs encapsulados em {} ou sem isso.

Além disso, ele ignora caracteres estranhos no final da string. Ambos SELECT CAST('{5D944516-98E6-44C5-849F-9C277833C01B}ssssssssss' as uniqueidentifier) e SELECT CAST('5D944516-98E6-44C5-849F-9C277833C01BXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' as uniqueidentifier) ter sucesso por exemplo.

Na maioria dos agrupamentos padrão, o LIKE '[a-zA-Z0-9]' acabará combinando caracteres como À ou Ë

Finalmente, se a conversão de linhas em um resultado para uniqueidentifier, é importante colocar a tentativa de conversão em uma expressão de caso, pois a conversão pode ocorrer antes que as linhas sejam filtradas pelo WHERE .

Então (pegando emprestado a ideia de @r0d30b0y) uma versão um pouco mais robusta pode 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 + '}%'