Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Грешка при връщане на CTE

В SQL Server има Ред на логическа обработка на израза SELECT , което определя кога обектите, дефинирани в една стъпка, са достъпни за клаузите в следващите стъпки:

  1. ОТ
  2. ВКЛЮЧЕНО
  3. ПРИСЪЕДИНЕТЕ СЕ
  4. КЪДЕ
  5. ГРУПИРАНЕ ПО
  6. С CUBE или С РОЛЪП
  7. ИМАНЕ
  8. ИЗБЕРЕТЕ
  9. ОТЛИЧЕН
  10. ПОРЪЧАЙТЕ ПО
  11. ТОП

Това е начинът, по който вашата заявка ще бъде обработена и вашата заявка изглежда напълно добре. Но понякога SQL Server решава да не следва този ред, за да оптимизира вашата заявка.

Във вашия случай, SQL Server може просто да преобразува/трансформира вашата заявка в друга и да извърши convert функция, преди да приложите where isnumeric филтриране.

Ако направим заявката ви малко по-сложна (но все още дава същите резултати), SQL Server този път изпълнява кода правилно:

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

Във вашия случай (и това е, което правя в такива ситуации, когато различни типове се съхраняват в една колона), можете просто да използвате TRY_CONVERT функция:

;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. Неуспешно преобразуване при преобразуване от символен низ в уникален идентификатор

  2. SQL Server ИЗБЕРЕТЕ ПОСЛЕДНИ N реда

  3. Заобикаляне на ограничението за максимални колони на SQL Server 1024 и размер на записа 8kb

  4. SQL:клауза IF в клаузата WHERE

  5. System.Data.SqlClient.SqlException:Неправилен синтаксис близо до '='