Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

CTE-Rückgabefehler

In SQL Server es gibt Logische Verarbeitungsreihenfolge der SELECT-Anweisung , die bestimmt, wann die in einem Schritt definierten Objekte den Klauseln in nachfolgenden Schritten zur Verfügung gestellt werden:

  1. VON
  2. EIN
  3. MITMACHEN
  4. WO
  5. GRUPPE NACH
  6. MIT CUBE oder MIT ROLLUP
  7. HABEN
  8. AUSWÄHLEN
  9. DISTINKT
  10. BESTELLEN VON
  11. TOP

So wird Ihre Abfrage verarbeitet und Ihre Abfrage sieht vollkommen in Ordnung aus. Aber manchmal der SQL Server beschließt, dieser Reihenfolge nicht zu folgen, um Ihre Abfrage zu optimieren.

In Ihrem Fall der SQL Server könnte darin bestehen, Ihre Abfrage in eine andere zu vereinfachen/umzuwandeln und die convert durchzuführen -Funktion, bevor Sie where isnumeric anwenden filtern.

Wenn wir Ihre Abfrage etwas komplexer gemacht haben (aber immer noch die gleichen Ergebnisse liefern), wird der SQL Server führt den Code dieses Mal korrekt aus:

;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 Ihrem Fall (und das mache ich in solchen Situationen, wenn verschiedene Typen in einer Spalte gespeichert sind) können Sie einfach 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