Sql 在where子句中使用decimal-算术溢出错误将nvarchar转换为数据类型numeric
我遇到sql server错误,不确定如何修复。我在视图“Products”中得到一列“NAME”,类型为Sql 在where子句中使用decimal-算术溢出错误将nvarchar转换为数据类型numeric,sql,sql-server,Sql,Sql Server,我遇到sql server错误,不确定如何修复。我在视图“Products”中得到一列“NAME”,类型为nvarchar(30),查询是在代码中动态生成的,因此无法完全更改它 对于以下查询,我得到了“将nvarchar转换为数据类型numeric时出现算术溢出错误”: select * FROM Products WHERE NAME=12.0 但是,以下查询可以正常工作: select * FROM Products WHERE NAME=112.0 我被这个错误弄糊涂了,我知道我应
nvarchar(30)
,查询是在代码中动态生成的,因此无法完全更改它
对于以下查询,我得到了“将nvarchar转换为数据类型numeric时出现算术溢出错误”:
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))
有什么特别的原因吗
非常感谢 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子句中指定的数字的情况
编辑:。联机丛书在DECIMAL
和NUMERIC
的数据类型定义中指出:
在Transact-SQL语句中,带小数点的常量是
使用最小值自动转换为数字数据值
精度和比例是必要的。例如,常数12.345为
转换为精度为5且刻度为3的数值
因此,当您使用常量“12.0”发出查询时,它将被转换为数据类型
NUMERIC(3,1)
,然后尝试转换NVARCHAR
值以匹配 如果NAME
是一个varchar()
,那么将它与varchar()
进行比较,而不是一个数字:NAME='12.0'
@GordonLinoff,是的,这会起作用,但是为什么112.0可以正常工作,而12.0不能呢?没有设置。在动态查询句柄中使用CAST或CONVERT函数。选择*FROM#temp WHERE col1=cast(12.0作为nvarchar(30))……正如Gordon所说,符号两边的EQUAL to operator excepts数据类型应该相同。感谢Ahiggins,这解释了很多,表中最大的数字是500,所以112.0可以工作,在我将1000放入表中之后,112.0失败了。