ORDER BY子句中的非整数常量

时间:2015-02-26 04:31:28

标签: sql sql-server

升级顾问说:

  

在90或更高版本的兼容模式下,ORDER BY子句中不允许使用非整数常量"。

但是,当我在SQL Server 2008中尝试以下语句时,它的工作正常。所以,我的问题是:什么是非整数常数?

SELECT
    COALESCE( fi.Payee, -1 ) AS 'Payee',
    COALESCE( p.ProvNo, '' ) AS 'ProviderNo'
FROM
    dbo.tbl_Emp
ORDER BY
    'Payee',
    'ProviderNo' 

3 个答案:

答案 0 :(得分:1)

1)非整数常量是......不是整数的常数。

实施例: 'string1'表示字符串常量

0x01表示varbinary常量

{ts '2015-02-26 06:00:00'}表示日期时间常量

1.23表示数字常量

2)所以单引号用于定义字符串常量/字符串常量 SQL Server也允许使用单引号也用作列标识符分隔符:

SELECT ... expression AS 'Column1'
FROM ...

在此上下文中明确指出'Column1'是列标识符在ORDER BY中使用时:ORDER BY 'Column1'它会产生混淆,因为SQL Server不知道它是否代表字符串文字(字符串常量)或它表示列标识符/列名。

3)SQL Server允许在ORDER BY中使用整数常量SELECT ColA, ColB, ColC FROM ... ORDER BY 2。在这种情况下,2是列ColB的索引。此外,如果您想按ColBColC排序,则可以使用ORDER BY 2, 3。列索引的使用被认为是不好的做法。

4)在这种情况下,我会使用

ORDER BY Payee, ProviderNo

ORDER BY [Payee], [ProviderNo]

答案 1 :(得分:0)

Integer constants 由一串数字表示,这些数字未用引号括起来且不包含小数点。整数常量必须是整数;它们不能包含小数。

以下是 Integer constants

的示例
1894 
2

您在'''''''中提到了 Non-Integer Constants 。您的查询中的双引号

请参阅Constants

MSDN 链接

答案 2 :(得分:0)

在Spring Boot上下文中遇到了相同的问题。我使用jpa为Postgres数据库创建了本机查询。

此查询会在ORDER BY 异常中生成非整数常量。

@Query(nativeQuery = true, value = "SELECT * FROM farm.cow o WHERE o.id > :uuid ORDER BY 'id' FETCH FIRST :limit ROWS ONLY ")
List<Cow> findCows(@Param("uuid") UUID String, @Param("limit") int limit);

要解决此异常,我只需将ORDER BY'id'更改为-> ORDER BY \“ id \”。这种方法解决了我的问题。

@Query(nativeQuery = true, value = "SELECT * FROM farm.cow o WHERE o.id > :uuid ORDER BY \"id\" FETCH FIRST :limit ROWS ONLY ")
List<Cow> findCows(@Param("uuid") UUID String, @Param("limit") int limit);