В SQL Server
има Ред на логическа обработка на израза SELECT
, което определя кога обектите, дефинирани в една стъпка, са достъпни за клаузите в следващите стъпки:
- ОТ
- ВКЛЮЧЕНО
- ПРИСЪЕДИНЕТЕ СЕ
- КЪДЕ
- ГРУПИРАНЕ ПО
- С CUBE или С РОЛЪП
- ИМАНЕ
- ИЗБЕРЕТЕ
- ОТЛИЧЕН
- ПОРЪЧАЙТЕ ПО
- ТОП
Това е начинът, по който вашата заявка ще бъде обработена и вашата заявка изглежда напълно добре. Но понякога 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