如何在非数字字段中查询"之间"的数字数据?

Ben*_*ter 7 t-sql sql-server-2000 short-circuiting

我有一个我刚刚在数据库中找到的查询失败导致报告失败的问题.查询的基本要点:

Select *
From table
Where IsNull(myField, '') <> ''
And IsNumeric(myField) = 1
And Convert(int, myField) Between @StartRange And @EndRange
Run Code Online (Sandbox Code Playgroud)

现在,myField不包含所有行中的数值数据[它是nvarchar类型] ...但是这个查询显然是这样设计的,它只关心这个字段中的数据是数字的行.

这个问题是T-SQL(我理解的附近)不会使Where子句短路,从而导致它在数据不是数字的记录上抛弃,但异常:

Msg 245, Level 16, State 1, Line 1 Conversion failed when converting the nvarchar value '/A' to data type int.

如果没有将myField为numeric的所有行转储到临时表中,然后查询该字段在指定范围内的行,那么我能做到的最佳方法是什么?

我的第一个解析纯粹是为了尝试分析返回的数据,看看发生了什么:

Select *
From (
   Select *
   From table
   Where IsNull(myField, '') <> ''
   And IsNumeric(myField) = 1
) t0
Where Convert(int, myField) Between @StartRange And @EndRange
Run Code Online (Sandbox Code Playgroud)

但是我得到了我为第一个查询所做的相同错误,我不确定我理解,因为我现在没有转换任何不应该是数字的数据.子查询应该只返回myField包含数字数据的行.

也许我需要早茶,但这对任何人都有意义吗?另一组眼睛会有所帮助.

提前致谢

Dam*_*ver 6

IsNumeric仅告诉您该字符串可以转换为SQL Server中的一种数字类型.它可能能够将其转换为金钱或浮动,但可能无法将其转换为int.

改变你的

IsNumeric(myField) = 1
Run Code Online (Sandbox Code Playgroud)

成为:

not myField like '%[^0-9]%' and LEN(myField) < 9
Run Code Online (Sandbox Code Playgroud)

(也就是说,你希望myField只包含数字,并且适合int)

编辑示例:

select ISNUMERIC('.'),ISNUMERIC('£'),ISNUMERIC('1d9')
Run Code Online (Sandbox Code Playgroud)

结果:

----------- ----------- -----------
1           1           1

(1 row(s) affected)
Run Code Online (Sandbox Code Playgroud)