I wrote a CTE to remove non numeric values from a data set, then get a count of numeric values within a range.
WITH dtr AS ( SELECT resultlevel r FROM dbo.Result WHERE DrugID = 'AMP' AND ISNUMERIC(ResultLevel) = 1 AND AuditStamp > '1/1/2016' AND DeleteFlag = 0 ) SELECT COUNT(*) FROM dtr WHERE CONVERT(INT, r) BETWEEN 50 AND 75 This returns an error in SMS
Msg 245, Level 16, State 1, Line 2 Conversion failed when converting the varchar value 'PND ' to data type int. This error is completely possible without the 'dtr' query in the CTE.
When I rewrite this, instead of a CTR, but a TEMP table, it works.
SELECT resultlevel r INTO #d FROM dbo.Result WHERE DrugID = 'AMP' AND ISNUMERIC(ResultLevel) = 1 AND AuditStamp > '1/1/2016' AND DeleteFlag = 0 SELECT COUNT(*) FROM #d WHERE CONVERT(INT, r) BETWEEN 50 AND 75 So my questions is why?? I have always thought a CTE was like creating a TEMP table.
TEST DATA
if object_id('tempdb..#temp') is not null drop table #temp create table #temp (result char(5)) insert into #temp (result) values ('1'),('A'),('>2'),('PEN ') ,('@3'),('-2'),('-33') ;with isnum AS ( SELECT result FROM #temp WHERE ISNUMERIC(result) = 1) --Selecting from the CTE yields 1, -2, and -33 all of which can be converted to INT --Running the query with the where clause causes the conversion error SELECT result, ISNUMERIC(result) FROM isnum --WHERE CONVERT(INT,result) > 1
CTEisn't a temp table. A more accurate description is that it is a temporary view. And will behave as such.trim(resultlevel) r?select ISNUMERIC('PND ')doesn't equal 1 so I feel like there has to be more here... is there some code you are leaving out? That value shouldn't be int he CTE result set.Select isnumeric('PND ') as result;what is the value of result?