2012-01-30 143 views
1

首先,让我说明我已经阅读过各种类似的帖子,并且无法确定其他海报有此错误信息的问题与我遇到的情况之间的相似之处,遇到过。也许我没有正确地搜索,但这是场景。我试图在转换为数字值时在表中搜索小于70的值。有时值可以用逗号(即3,080等)存储,所以我有一个替换语句来删除逗号。以下查询中的obsValue列是varchar(2000),我猜这可能与它有关。我的初步查询工作:将varchar转换为数据类型的算术溢出错误

Select name, obsValue 
From database.dbo.table 
Where name in ('LDL') 
and isnumeric(obsvalue) = 1 
and cast(replace(obsvalue,',','') as decimal(18)) < 70 

此带回预期值,但它不是我想要寻找的唯一name。其他例子包括('LDL(CALC)')。使用UNION语句将允许我一起查询联合查询,但不幸的是,我不控制应用程序代码,这不是一个选项。我可以用一个IN条款,所以最终的查询将是这样的,当我在寻找各种name值的唯一选择:

Select name, obsValue 
From database.dbo.table 
Where name in ('LDL', 'LDL(CALC)') 
and isnumeric(obsvalue) = 1 
and cast(replace(obsvalue,',','') as decimal(18)) < 70 

不幸的是做这种方式是从哪里获得的错误信息。我很抱歉,如果这已经在其他地方得到解答。请链接,我将在信贷到期时给予贷款。

+0

你会得到什么错误?另外,为了调试,尝试将其分解成多个部分来查看哪个函数导致错误。测试仅运行in()函数,isnumeric()和cast()。可能只有一部分查询产生错误。 – Beth 2012-01-30 16:45:38

+0

也许小数点?,如果您将演员视为“DECIMAL(36,6)”或类似的东西,会发生什么? – Lamak 2012-01-30 16:45:48

+0

@beth这是问题的标题,算术溢出错误将varchar转换为数据类型数字。刚刚看到你的编辑,这个问题不在任何一个函数中,问题是当我尝试在'IN'子句中包含多个值时。防爆。 IN('LDL')'起作用,'IN('LDL(CALC)')起作用,IN('LDL','LDL(CALC)')失效。 @Lamak'DECIMAL(36,6)'会导致相同的错误 – akousmata 2012-01-30 16:47:37

回答

1

,可随时更换则IsNumeric(obsvalue)与(选择obsvalue其中ISNUMERIC(obsvalue)= 1)。

Select name, obsValue 
From database.dbo.table 
Where name in ('LDL', 'LDL(CALC)') 
and isnumeric(obsvalue) = 1 
and cast(replace((select obsvalue where isnumeric(obsvalue) = 1),',','') as decimal(18)) < 70 
1

可能存在obsvalue值对于您的演员而言太大(作为十进制)的功能,但不管怎样都不关心,因为它们不符合in()标准。

尝试在子查询中应用cast(),将查询限制为实际需要转换的obsvalues。

此外,由于逗号仅在值大于999时存在,而您正在测试的值小于70,所以不需要替换。事实上,您可以排除任何包含逗号的行,因为您知道它太高。

+0

我没有在我的OP中说过这个,但是70的值是任意的,它是由用户设置的,而3000的LDL值永远不会发生,所以'IN'子句和要测试的CAN数值可以由最终用户。我的错不在于更清楚。 – akousmata 2012-01-30 16:54:47

+0

好了,然后继续替换逗号,但尝试将查询拆分为内部查询中的in()子句和外部查询中的cast()子句。然后,如果你仍然得到错误(如果用户选择了这个条件,你可能会知道它是有效的)(db中的废话) – Beth 2012-01-30 16:58:06

+0

我给出了上面的答案,但是+ 1'd *这个以及在提供上述答案之前,你的建议让我朝着正确的方向前进。感谢您的意见。 (*试图,这是我的第一个SO问题,所以没有代表... DOH!) – akousmata 2012-01-30 18:47:23

1

问题是SQL Server正在以不同的方式优化查询,当IN子句中有多个项目时。您可以使用CASE语句来避免优化

SELECT name, obsvalue 
FROM database.dbo.table 
WHERE (CASE WHEN (isnumeric(obsvalue) = 1 
      AND name in ('LDL', 'LDL(CALC)')) 
     THEN cast(replace(obsvalue,',','') as decimal(18)) 
     ELSE null END) < 70 
+0

对我来说,似乎很奇怪,优化器将是这里的罪魁祸首,虽然我不能争辩,因为这确实允许查询上班。 – akousmata 2012-01-30 18:46:46

+0

根据原始答复者的请求将答案翻出来。 – akousmata 2012-01-31 14:23:17

相关问题