Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 在where子句中使用decimal-算术溢出错误将nvarchar转换为数据类型numeric_Sql_Sql Server - Fatal编程技术网

Sql 在where子句中使用decimal-算术溢出错误将nvarchar转换为数据类型numeric

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 我被这个错误弄糊涂了,我知道我应

我遇到sql server错误,不确定如何修复。我在视图“Products”中得到一列“NAME”,类型为
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失败了。