sql >> Databasteknik >  >> RDS >> Sqlserver

Hur kontrollerar man om en sträng är en unik identifierare?

SQL Server 2012 gör det hela mycket enklare med TRY_CONVERT(UNIQUEIDENTIFIER, expression)

SELECT something
FROM   your_table
WHERE  TRY_CONVERT(UNIQUEIDENTIFIER, your_column) IS NOT NULL;

För tidigare versioner av SQL Server missar de befintliga svaren några punkter som betyder att de antingen inte matchar strängar som SQL Server faktiskt kommer att casta till UNIQUEIDENTIFIER utan klagomål eller kan fortfarande orsaka ogiltiga cast-fel.

SQL Server accepterar GUID antingen inslagna i {} eller utan detta.

Dessutom ignorerar den främmande tecken i slutet av strängen. Båda SELECT CAST('{5D944516-98E6-44C5-849F-9C277833C01B}ssssssssss' as uniqueidentifier) och SELECT CAST('5D944516-98E6-44C5-849F-9C277833C01BXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' as uniqueidentifier) lyckas till exempel.

Under de flesta standardsammanställningar visas LIKE '[a-zA-Z0-9]' kommer att matcha tecken som À eller Ë

Slutligen, om du castar rader i ett resultat till en unik identifierare är det viktigt att placera castförsöket i ett case-uttryck eftersom casten kan inträffa innan raderna filtreras av WHERE .

Så (lånar @r0d30b0ys idé) kan en lite mer robust version vara

;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. Så här skapar du en rapport från en tabell i Access 2016

  2. Hur TAN() fungerar i MariaDB

  3. Hur får jag SQLSRV-tillägget att fungera med PHP, eftersom MSSQL är utfasat?

  4. Ett JNI-fel har uppstått, kontrollera din installation och försök igen i Eclipse x86 Windows 8.1