sql >> Database >  >> RDS >> Sqlserver

Hoe controleer ik of een string een uniqueidentifier is?

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


  1. SQL Server genoemd exemplaar met Visual Studio 2017 Installer-project

  2. Hoe Lighttpd te installeren met PHP, MariaDB en PhpMyAdmin in Ubuntu

  3. REMAINDER() Functie in Oracle

  4. Downtime en Hotpatch-toepasmodus in gebruik R12.2