SQL Server 2012 macht dies alles viel einfacher mit TRY_CONVERT(UNIQUEIDENTIFIER, expression)
SELECT something
FROM your_table
WHERE TRY_CONVERT(UNIQUEIDENTIFIER, your_column) IS NOT NULL;
Für frühere Versionen von SQL Server fehlen in den vorhandenen Antworten einige Punkte, was bedeutet, dass sie möglicherweise nicht mit Zeichenfolgen übereinstimmen, die SQL Server tatsächlich in UNIQUEIDENTIFIER
umwandelt ohne Beanstandung oder kann immer noch zu ungültigen Cast-Fehlern führen.
SQL Server akzeptiert GUIDs, die entweder in {}
eingeschlossen sind oder ohne dies.
Außerdem ignoriert es überflüssige Zeichen am Ende der Zeichenfolge. Beide SELECT CAST('{5D944516-98E6-44C5-849F-9C277833C01B}ssssssssss' as uniqueidentifier)
und SELECT CAST('5D944516-98E6-44C5-849F-9C277833C01BXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' as uniqueidentifier)
erfolgreich sein.
Unter den meisten Standardsortierungen ist LIKE '[a-zA-Z0-9]'
ergibt übereinstimmende Zeichen wie À
oder Ë
Schließlich ist es beim Casting von Zeilen in einem Ergebnis zu uniqueidentifier wichtig, den Cast-Versuch in einen case-Ausdruck zu setzen, da die Umwandlung erfolgen kann, bevor die Zeilen durch WHERE
gefiltert werden .
Also (in Anlehnung an die Idee von @ r0d30b0y) könnte eine etwas robustere Version sein
;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 + '}%'