sql >> Database >  >> RDS >> Sqlserver

CTE retourneert fout

In SQL Server er is Logische verwerkingsvolgorde van de SELECT-instructie , die bepaalt wanneer de objecten die in één stap zijn gedefinieerd, beschikbaar worden gesteld aan de clausules in volgende stappen:

  1. VAN
  2. AAN
  3. DOEN
  4. WAAR
  5. GROEPEREN OP
  6. MET KUBUS of MET ROLLUP
  7. HEBBEN
  8. SELECTEER
  9. VERSCHILLEND
  10. BESTEL DOOR
  11. TOP

Dit is hoe uw vraag wordt verwerkt en uw vraag ziet er prima uit. Maar soms kan de SQL Server besluit deze volgorde niet te volgen om uw zoekopdracht te optimaliseren.

In uw geval de SQL Server kan uw zoekopdracht eenvoudigweg in een andere omzetten/transformeren en de convert . uitvoeren functie, voordat u de where isnumeric . toepast filteren.

Als we uw zoekopdracht iets complexer hebben gemaakt (maar nog steeds dezelfde resultaten geeft), zal de SQL Server voert de code deze keer correct uit:

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

In jouw geval (en dit is wat ik doe in dergelijke situaties waarin verschillende typen in één kolom zijn opgeslagen), kun je eenvoudig TRY_CONVERT functie:

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

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



  1. AT TIME ZONE – een nieuwe favoriete functie in SQL Server 2016

  2. VERWIJDER UIT `tabel` ALS `alias` ... WAAR `alias`.`kolom` ... waarom syntaxisfout?

  3. Mysql reguliere expressie zoeken zonder herhalende tekens

  4. SQL ORDER BY met behulp van voorbereide instructies