sql >> Databasteknik >  >> RDS >> Sqlserver

CTE returnerar fel

I SQL Server det finns logisk bearbetningsordning för SELECT-satsen , som bestämmer när objekten som definieras i ett steg görs tillgängliga för satserna i efterföljande steg:

  1. FRÅN
  2. GÅ MED
  3. VAR
  4. GRUPPER EFTER
  5. Med KUB eller MED ROLLUP
  6. HA
  7. VÄLJ
  8. DISTINKT
  9. BESTÄLL AV
  10. TOPP

Så här kommer din fråga att bearbetas och din fråga ser helt ok ut. Men ibland, SQL Server bestämmer sig för att inte följa denna ordning för att optimera din fråga.

I ditt fall, SQL Server kan vara att helt enkelt konvertera/omvandla din fråga till en annan och utföra convert funktion, innan du använder where isnumeric filtrering.

Om vi ​​gjorde din fråga lite mer komplex (men fortfarande ger samma resultat), kan SQL Server exekverar koden korrekt den här gången:

;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 ditt fall (och det är vad jag gör i sådana situationer när olika typer är lagrade i en kolumn), kan du helt enkelt använda 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. Använda ett IF-uttalande i en MySQL SELECT-fråga

  2. NodeJS Hur man hanterar samtidig förfrågan till MySQL

  3. Ogiltigt tecken i SQL-frågesträng (ORA-00911)

  4. Design av rekommendationsmotordatabasen?