SQL 值超出范围

本文关键字:范围 SQL | 更新日期: 2023-09-27 17:56:51

我有一个存储过程,参数如下:

@longitude decimal(5, 5),
@latitude decimal(5, 5),
@radius decimal(2, 2),
@DayOfWeek int

我传入经度-87.66826,我得到

参数值 '-87.66826' 超出范围。

我在这里错过了什么愚蠢的东西吗?

SQL 值超出范围

@longitude decimal(5,5)更改为@longitude decimal(7,5) 。还要更改其他十进制参数类型。

decimal(5,5) 表示小数点前的 0 位数字和小数点后的 5 位数字。但是您需要在小数点之前有 2 位数字,在小数点后需要 5 位数字。所以总长度是 7。

此外,建议将这些类型用于在 Sql Sevrer 2008 中存储语言和经度。您可以阅读本文以使用这些类型。

您应该查看新的空间数据类型,这些数据类型是 在 SQL Server 2008 中引入。他们是专门设计的 一种任务,使索引和查询数据变得更加容易, 更高效。

Decimal(5,5) 表示 5 个总数字和小数点后面的 5 个数字,因此它表示小数点前的零位。

此外,根据您使用的SQL Server,还有geometry数据类型可以存储经度和纬度

简单。

像这样改变

@longitude decimal(7,5),
@latitude decimal(7,5),
@radius decimal(2,2),
@DayOfWeek int
decimal [ (p[ ,s] )] and numeric[ (p[ ,s] )]

根据十进制和数字 (Transact-SQL):

固定精度和小数位数。当使用最大精度时, 有效值为 - 10^38 +1 到 10^38 - 1。ISO 同义词 对于十进制,是 dec 和 dec(p, s)。数值在功能上是等效的 到十进制。

P(精度)

将存储的最大十进制数字总数,两者 小数点的左侧和右侧。精度必须 是介于 1 到最大精度 38 之间的值。默认 精度为 18。

s(刻度)

将存储在 小数点。从 p 中减去此数字以确定 小数点左侧的最大位数。规模必须 是 0 到 p 之间的值。仅当精度时才能指定小数位数 是指定的。默认比例为 0;因此,0 <= s <= p。最大 存储大小因精度而异。