sql >> Databáze >  >> RDS >> Sqlserver

Jak zkontrolovat, zda je řetězec jedinečným identifikátorem?

SQL Server 2012 to vše mnohem usnadňuje pomocí TRY_CONVERT(UNIQUEIDENTIFIER, expression)

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

U předchozích verzí SQL Serveru stávající odpovědi postrádají několik bodů, což znamená, že se nemusí shodovat s řetězci, které SQL Server ve skutečnosti přenese do UNIQUEIDENTIFIER bez stížnosti nebo může i tak způsobit neplatné chyby při odesílání.

SQL Server přijímá GUID buď zabalené v {} nebo bez tohoto.

Navíc ignoruje cizí znaky na konci řetězce. Oba SELECT CAST('{5D944516-98E6-44C5-849F-9C277833C01B}ssssssssss' as uniqueidentifier) a SELECT CAST('5D944516-98E6-44C5-849F-9C277833C01BXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' as uniqueidentifier) například uspět.

Ve většině výchozích řazení LIKE '[a-zA-Z0-9]' skončí odpovídající znaky, jako je À nebo Ë

A konečně, pokud přenášíte řádky ve výsledku na jedinečný identifikátor, je důležité vložit pokus o přetypování ve výrazu typu case, protože k přetypování může dojít dříve, než budou řádky filtrovány pomocí WHERE .

Takže (vypůjčením si nápadu @r0d30b0y) by mohla být trochu robustnější verze

;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. Aktualizujte více hodnot sloupců tabulky pomocí jednoho dotazu

  2. Vyberte číslo řádku v postgresu

  3. Datový model realitní kanceláře

  4. Rychlý tip – Zrychlete pomalé obnovení z protokolu transakcí