【发布时间】:2011-06-16 01:59:54
【问题描述】:
我有一份已经使用了一段时间的报告——事实上,公司的发票系统在很大程度上依赖于这份报告(免责声明:我没有写它)。过滤基于 VarChar(50) 类型的字段是否介于用户传入的两个数值之间。
问题在于,现在过滤数据的字段不仅有简单的非数字值,例如“/A”、“TEST”和大量其他非数字数据,而且还有数字值似乎在挑战我能想到的任何类型的数字转换。
以下(简化的)测试查询演示了失败:
Declare @StartSummary Int,
@EndSummary Int
Select @StartSummary = 166285,
@EndSummary = 166289
Select SummaryInvoice
From Invoice
Where IsNull(SummaryInvoice, '') <> ''
And IsNumeric(SummaryInvoice) = 1
And Convert(int, SummaryInvoice) Between @StartSummary And @EndSummary
我也尝试过使用 bigint、real 和 float 进行转换,但都给了我类似的错误:
消息 8115,第 16 级,状态 2,第 7 行 算术溢出错误转换 将表达式转换为数据类型 int。
我尝试过其他较大的数值数据类型,例如 BigInt,但出现了同样的错误。我还尝试使用子查询通过仅提取具有数字数据的字段然后在包装查询中转换这些字段来回避转换问题,但随后我得到其他错误,这些错误都是主题的变体,表明存储的值SummaryInvoice 字段无法转换为相关数据类型。
除了仅将带有数字 SummaryInvoice 字段的记录提取到临时表中,然后针对临时表进行查询之外,是否有任何一步解决方案可以解决此问题?
编辑:这是我怀疑导致问题的字段数据:
汇总发票
1111111111111111111111111
IsNumeric 表明该字段是数字的——它是。但是尝试将其转换为 BigInt 会导致算术溢出。有任何想法吗?这似乎不是一个孤立的事件,似乎有许多记录填充了导致此问题的数据。
【问题讨论】:
标签: sql tsql sql-server-2000