Oracle 到 SQL 服务器:返回的行集有限的动态查询

Oracle to SQL Server : dynamic query with limited rowset returned

我有一个困难的(如果不是不可能的话)问题需要解决。我有一个 Oracle 查询,我必须将它转换为 T-SQL 语法。

Oracle 中的查询如下所示:

__select_wrapper=select * from(
     select rownum row_num, inner__c3p__query.* 
     from ({0}) inner__c3p__query) 
     where row_num>@offset and (row_num<=(@offset+@count) or (@count<1))

这来自属性文件。基本上,这一行执行任何 SQL 查询,将结果集命名为 "inner__c3p__query",并从中选择所有内容以及一个 rownum。然后,它通过 rownum 过滤结果:>@offset 和 <=@offset + @count。因此,实际上,它执行任何 SQL 查询,并且 returns 一个有限的行集,例如从第10行到第20行。

现在,我的工作是将其转化为T-SQL。我花了一天半的时间查找所有可能的想法,但到目前为止,我还没有成功。我尝试了很多东西,但都没有用。问题是,我不能使用 ROW_NUMBER() 函数,因为它在 OVER() 子句中至少需要一列,而我无法提供任何列,因为实际查询仅在运行时确定。

你们有什么想法吗,或者在数据库方面真的不可能吗?

提前致谢!

加布

ROW_NUMBER() 只需要 ORDER BY 部分中的一列(否则你如何排序?)

如果原始顺序是随机的,那么只需在查询中选择一个随机列(如第一列)。在 ORDER BY 中,您可以使用列号...只需使用第一列或第一列。

ROW_NUMBER() OVER (ORDER BY 1) 

虽然我对这种方法有很多保留意见,尤其是针对 SQL 注入攻击,但以下方法应该有效:

select * from(
 select ROW_NUMBER() OVER(ORDER BY (Select NULL)) row_num, 
    inner__c3p__query.* 
 from ({0}) inner__c3p__query) 
 where row_num>@offset and (row_num<=(@offset+@count) or (@count<1))

不幸的是,由于排序列永远不会改变,如果您尝试使用它进行分页,则无法保证在重复执行中始终将相同的 row_num 分配给同一行。