使用十进制where子句 - 算术溢出错误转换为nvarchar数据类型数字

问题描述:

我有一个SQL Server错误和不知道如何解决它。我有一个观点“产品”一栏“名称”有型的nvarchar(30) ,查询是在代码中动态生成的,所以不能完全改变它。使用十进制where子句 - 算术溢出错误转换为nvarchar数据类型数字

我得到的“算术溢出错误转换nvarchar的数据类型的数字。”以下查询:

select * FROM Products WHERE NAME=12.0 

但是下面的查询工作正常:

select * FROM Products WHERE NAME=112.0 

我很困惑的错误,我知道我应该把周围数引号,但只是想知道为什么第二查询工作,并有任何设置可以使第一个查询工作?

更新:也

select * FROM Products WHERE NAME=cast('12.0' as decimal(4,2)) 

不起作用,但

select * FROM Products WHERE NAME=cast('12.0' as decimal(5,2)) 

作品,任何特定的原因是什么?

非常感谢!

+1

如果'NAME'是一个'VARCHAR()'然后比较它与一个'VARCHAR()',而不是一个号码:'NAME = '12 .0''。 – 2014-12-02 12:06:29

+0

@ GordonLinoff,是的,这将工作,但为什么112.0工作正常,但12.0没有? – Harry 2014-12-02 12:08:35

+0

没有设置和全部。在CAST或CONVERT函数的动态查询句柄中。 select * FROM #temp WHERE col1 = cast(12.0 as nvarchar(30)).....正如Gordon Said EQUAL运算符,除了数据类型应该在符号的任一侧相同。 – knkarthick24 2014-12-02 12:23:51

SQL Server正在试图将这些值转换在表中,以匹配编码到您的WHERE子句价值的感知数据类型。如果您有更多的数字数据值(例如,DECIMAL(5,2)),并尝试将它们转换为具有较少(例如,DECIMAL(3,1)),那么你就会有溢出匹配的值。

考虑下面的SQL,这将引发错误:

DECLARE @Products TABLE (NAME NVARCHAR(30)) 
INSERT INTO @Products VALUES ('123.45') 
INSERT INTO @Products VALUES ('12.0') 

SELECT * 
FROM @Products 
WHERE NAME = 12.0 

现在试试这个,这将工作:

DECLARE @Products TABLE (NAME NVARCHAR(30)) 
INSERT INTO @Products VALUES ('123.45') 
INSERT INTO @Products VALUES ('12.0') 

SELECT * 
FROM @Products 
WHERE NAME = CAST(12.0 AS DECIMAL(5,2)) 

它们之间的区别是,SQL Server现在占情况该表包含的数字比WHERE子句中指定的数字具有更高的精度和/或比例。

编辑:further reading。联机丛书状态中的数据类型定义为DECIMALNUMERIC是:

In Transact-SQL statements, a constant with a decimal point is automatically converted into a numeric data value, using the minimum precision and scale necessary. For example, the constant 12.345 is converted into a numeric value with a precision of 5 and a scale of 3.

因此,当您发出带有恒定的'12 0.0' 的查询时,它被转换为数据类型NUMERIC(3,1),然后试图转换要匹配的值为NVARCHAR

+0

感谢Ahiggins,这解释了很多,表中最大的数字是500,所以112.0的作品,我把1000放在表中,112.0失败。 – Harry 2014-12-02 13:15:14