Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Błąd zwracania CTE

W SQL Server istnieje Kolejność przetwarzania logicznego instrukcji SELECT , który określa, kiedy obiekty zdefiniowane w jednym kroku są udostępniane klauzulom w kolejnych krokach:

  1. OD
  2. DOŁĄCZ
  3. GDZIE
  4. GRUPUJ WG
  5. Z KOSTKĄ LUB Z ROLKĄ
  6. POSIADAJĄC
  7. WYBIERZ
  8. ODRÓŻNE
  9. ZAMÓW PRZEZ
  10. GÓRA

W ten sposób Twoje zapytanie zostanie przetworzone, a Twoje zapytanie wygląda idealnie. Czasami jednak SQL Server postanawia nie przestrzegać tej kolejności w celu optymalizacji zapytania.

W Twoim przypadku SQL Server może być po prostu przekształcaniem/przekształcaniem zapytania w inne i wykonywaniem convert funkcji, przed zastosowaniem where isnumeric filtracja.

Jeśli sprawiliśmy, że Twoje zapytanie stało się nieco bardziej złożone (ale nadal daje te same wyniki), SQL Server tym razem poprawnie wykonuje kod:

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

W Twoim przypadku (i to właśnie robię w takich sytuacjach, gdy różne typy są przechowywane w jednej kolumnie), możesz po prostu użyć TRY_CONVERT funkcja:

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

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



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Zmiana domeny serwera SQL 2008

  2. Jak znaleźć wszystkie naruszenia ograniczeń w bazie danych SQL Server

  3. Zaokrąglanie liczb dziesiętnych w SQL Server 2008

  4. Zatrzymaj dostęp przed używaniem niewłaściwej tożsamości podczas dołączania do tabeli połączonej na serwerze SQL

  5. Jak wyłączyć ograniczenie klucza obcego w programie SQL Server (przykłady T-SQL)