SQL Server 2012 maakt dit allemaal veel gemakkelijker met TRY_CONVERT(UNIQUEIDENTIFIER, expression)
SELECT something
FROM your_table
WHERE TRY_CONVERT(UNIQUEIDENTIFIER, your_column) IS NOT NULL;
Voor eerdere versies van SQL Server missen de bestaande antwoorden een paar punten, wat betekent dat ze ofwel niet overeenkomen met strings die SQL Server in feite naar UNIQUEIDENTIFIER
zal casten. zonder klacht of kan toch leiden tot ongeldige cast-fouten.
SQL Server accepteert GUID's ofwel verpakt in {}
of zonder dit.
Bovendien negeert het vreemde tekens aan het einde van de string. Beide SELECT CAST('{5D944516-98E6-44C5-849F-9C277833C01B}ssssssssss' as uniqueidentifier)
en SELECT CAST('5D944516-98E6-44C5-849F-9C277833C01BXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' as uniqueidentifier)
slagen bijvoorbeeld.
Onder de meeste standaard sorteringen de LIKE '[a-zA-Z0-9]'
zal eindigen met overeenkomende tekens zoals À
of Ë
Ten slotte, als rijen in een resultaat naar uniqueidentifier worden gecast, is het belangrijk om de cast-poging in een case-expressie te plaatsen, aangezien de cast kan plaatsvinden voordat de rijen worden gefilterd door de WHERE
.
Dus (het idee van @r0d30b0y lenen) zou een iets robuustere versie kunnen zijn
;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 + '}%'