我刚刚在数据库中发现了一个查询失败,导致报告失败。查询的基本要点:
Select *
From table
Where IsNull(myField, '') <> ''
And IsNumeric(myField) = 1
And Convert(int, myField) Between @StartRange And @EndRange
现在,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 为数字的所有行转储到临时表中,然后查询该字段在指定范围内的行,我该怎么做才是最佳的?
我的第一个解析纯粹是为了尝试分析返回的数据并查看发生了什么:
Select *
From (
Select *
From table
Where IsNull(myField, '') <> ''
And IsNumeric(myField) = 1
) t0
Where Convert(int, myField) Between @StartRange And @EndRange
但是我遇到了与第一个查询相同的错误,我不确定我是否理解,因为此时我没有转换任何不应该是数字的数据。子查询应该只返回 myField 包含数字数据的行。
也许我需要我的早茶,但这对任何人都有意义吗?另一双眼睛会有所帮助。
提前致谢