Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Comment vérifier si une chaîne est un identifiant unique ?

SQL Server 2012 rend tout cela beaucoup plus facile avec TRY_CONVERT(UNIQUEIDENTIFIER, expression)

SELECT something
FROM   your_table
WHERE  TRY_CONVERT(UNIQUEIDENTIFIER, your_column) IS NOT NULL;

Pour les versions antérieures de SQL Server, les réponses existantes manquent quelques points, ce qui signifie qu'elles peuvent ne pas correspondre aux chaînes que SQL Server convertira en fait en UNIQUEIDENTIFIER sans plainte ou peut encore finir par causer des erreurs de diffusion non valides.

SQL Server accepte les GUID soit enveloppés dans {} ou sans cela.

De plus, il ignore les caractères superflus à la fin de la chaîne. Les deux SELECT CAST('{5D944516-98E6-44C5-849F-9C277833C01B}ssssssssss' as uniqueidentifier) et SELECT CAST('5D944516-98E6-44C5-849F-9C277833C01BXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' as uniqueidentifier) réussir par exemple.

Sous la plupart des classements par défaut, le LIKE '[a-zA-Z0-9]' finira par correspondre à des caractères tels que À ou Ë

Enfin, si vous transmettez des lignes dans un résultat à un identifiant unique, il est important de placer la tentative de transtypage dans une expression de cas car le transtypage peut se produire avant que les lignes ne soient filtrées par le WHERE .

Donc (en empruntant l'idée de @r0d30b0y) une version légèrement plus robuste pourrait être

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