升级顾问说:
在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'
答案 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
的索引。此外,如果您想按ColB
和ColC
排序,则可以使用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);