2012-02-22 47 views
3

我有一个SQL数据库,其表名为premisis。我希望选择最高的premisisnumberSELECT MAX返回错误的值

这是我使用的SQL:

SELECT max(premisisnr) AS premisisnr FROM premisis 

的问题是,SQL Server将返回错误的值!在我的表中,我得到了一行premisisnumber 10,但使用上面的SQL语句返回的行数为premisisnumber 9.

为什么?另外,我该如何解决这个问题?

+2

请显示您的表格数据。 MAX()确实返回最大值。你有没有发布的WHERE子句? – 2012-02-22 16:08:33

+1

该列声明的是哪种类型? – MarcinJuraszek 2012-02-22 16:08:41

+6

您的列的数据类型是“CHAR”。将其更改为数字类型(整数)。 – 2012-02-22 16:09:09

回答

14

这听起来像premisisnr不是一个数值,而是一个char或varchar值。发生的事情是SQL Server根据字符串而不是数字值进行排序。所以10在9之前,因为1作为角色出现在9之前。

理想的解决方案是将premisisnr字段更改为int或数字值。如果这不是一个选项,你可以做到以下几点:

如果premisisnr是一个整数值:

select max(cast(premisisnr as int)) as premisisnr from premisis 

如果premisisnr是一个十进制值,你必须强制转换为十进制的精度和您需要的规模。

+0

+1)我会补充说,如果列数据类型不能改变,可能会谨慎的提到一个where子句(除了对于特定数字类型不可靠的'ISNUMERIC()')以外可以清除进入该列的垃圾导致错误,或检查约束,可以防止垃圾在第一个地方。 – 2012-02-22 16:19:43

+0

非常有效的点。我的经验是,有时一列不能更改的原因是因为某些应用程序会将数据绑定为它的数据类型,所以可能不会有任何字符垃圾,但有时可能会从应用程序层发挥其他约束。 – mjsalinger 2012-02-22 16:21:59

+0

当然,但应用程序无法停止所有广告胡言乱语那可能会继续。我永远不会相信约束,即使距离数据一层(我也不交出允许用户禁用约束/触发器等的权限):-)。 – 2012-02-22 16:27:21

0

看起来你可能有一个字符数据类型(char,nchar,varchar等)。

要正确获得数字字段的最大值,必须使用数字字段,例如, int

将数据类型更改为int,MAX()将工作。