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