sql >> Database teknologi >  >> RDS >> Sqlserver

CTE returnerer fejl

I SQL Server der er Logisk behandlingsrækkefølge for SELECT-sætningen , som bestemmer, hvornår de objekter, der er defineret i ét trin, gøres tilgængelige for klausulerne i efterfølgende trin:

  1. FRA
  2. TIL
  3. DELTAG
  4. HVOR
  5. GRUPPER EFTER
  6. Med TERNING eller MED ROLLUP
  7. HAR
  8. VÆLG
  9. DISTINKT
  10. BEstil efter
  11. TOP

Sådan vil din forespørgsel blive behandlet, og din forespørgsel ser helt fin ud. Men nogle gange er SQL Server beslutter ikke at følge denne rækkefølge for at optimere din forespørgsel.

I dit tilfælde er SQL Server kan være simpelthen at omdanne/transformere din forespørgsel til en anden og udføre convert funktion, før du anvender where isnumeric filtrering.

Hvis vi gjorde din forespørgsel lidt mere kompleks (men stadig giver de samme resultater), vil SQL Server udfører koden korrekt denne gang:

;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;

I dit tilfælde (og det er det, jeg gør i sådanne situationer, hvor forskellige typer er gemt i én kolonne), kan du blot bruge TRY_CONVERT funktion:

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

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



  1. MySQL-forespørgsel GRUPPER EFTER dag / måned / år

  2. Hibernate opretter ikke jointabel

  3. Konverter en række til flere rækker med færre kolonner

  4. SQL-kommando ikke afsluttet korrekt?