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

CTE vrací chybu

V SQL Server existuje Logické pořadí zpracování příkazu SELECT , který určuje, kdy jsou objekty definované v jednom kroku zpřístupněny klauzulím v následujících krocích:

  1. OD
  2. ZAPNUTO
  3. PŘIPOJIT SE
  4. KDE
  5. GROUP BY
  6. S KOSTKOU nebo S ROLLUP
  7. MÍT
  8. VYBRAT
  9. DISTINCT
  10. OBJEDNEJTE PODLE
  11. TOP

Takto bude váš dotaz zpracován a váš dotaz vypadá naprosto v pořádku. Někdy však SQL Server se rozhodne neřídit se tímto příkazem, aby optimalizoval váš dotaz.

Ve vašem případě SQL Server může jednoduše převést/převést váš dotaz na jiný a provést convert před použitím funkce where isnumeric filtrování.

Pokud jsme váš dotaz udělali trochu složitějším (ale stále dáváme stejné výsledky), SQL Server tentokrát provádí kód správně:

;with isnum AS ( 
    SELECT result
    FROM #temp 
    WHERE ISNUMERIC(result) = 1
    GROUP BY result
    HAVING MAX(result) = result
)
SELECT 
    result, 
    ISNUMERIC(result)
FROM isnum
WHERE CONVERT(INT,result) > 1;

Ve vašem případě (a to je to, co dělám v takových situacích, kdy jsou různé typy uloženy v jednom sloupci), můžete jednoduše použít TRY_CONVERT funkce:

;with isnum AS ( 
SELECT result 
FROM #temp 
WHERE ISNUMERIC(result) = 1)

SELECT 
    result, 
    ISNUMERIC(result)
FROM isnum
WHERE TRY_CONVERT(INT, result) > 1



  1. Jak vypočítat změny v Oracle sql

  2. Rozdělení částky pomocí čárky v orákulu

  3. Výpočet počtu celých měsíců mezi dvěma daty v SQL

  4. Změňte všechny tabulky v databázi