SQL值超出范围

时间:2014-04-05 05:02:11

标签: c# sql sql-server tsql

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

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

我传给-87.66826经度,我得

  

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

我在这里错过了一些愚蠢的东西吗?

3 个答案:

答案 0 :(得分:4)

@longitude decimal(5,5)更改为@longitude decimal(7,5)。也可以更改其他小数参数类型。

decimal(5,5)表示小数点前的0位和小数点后的5位。 但是你需要2位数字和小数点后5位数。总长度是7。

这些类型也建议用于存储Sql Sevrer 2008中的经度和经度。 您可以阅读this文章以了解如何使用这些类型。

  

您应该看一下新的Spatial数据类型   在SQL Server 2008中引入。它们是专门为此设计的   一种任务,使索引和查询数据更容易和   效率更高。

答案 1 :(得分:2)

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

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

答案 2 :(得分:1)

简单..

像这样改变

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

decimal [ (p[ ,s] )] and numeric[ (p[ ,s] )]

根据decimal and numeric (Transact-SQL)

  

修正了精度和刻度数。使用最大精度时   有效值来自 - 10 ^ 38 +1到10 ^ 38 - 1.IIS同义词   对于十进制,则为dec和dec(p,s)。数字在功能上是等价的   到十进制。

     

p(精确度)

     

将存储的最大小数位数   在小数点的左侧和右侧。精度必须   是一个从1到最大精度为38的值。默认值   精度是18。

     

s(比例)

     

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