Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Wie überprüfe ich, ob eine Zeichenfolge ein eindeutiger Bezeichner ist?

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