关于数据库:Oracle到SQL Server:返回有限行集的动态查询

Oracle to SQL Server : dynamic query with limited rowset returned

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

Oracle中的查询如下所示:

1
2
3
4
__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_uu c3p_uu query",并从中选择所有内容以及rownum。然后,它按rownum筛选结果:>@offset和<=@offset+@count。因此,实际上,它执行任何SQL查询,并返回一个有限的行集,例如从第10行到第20行。

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

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

事先谢谢!

加布


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

1
2
3
4
5
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_number()只需要按部分排序的列(否则如何排序?)

如果原始列是随机的,那么只需在查询中选择一个随机列(就像第一个一样),按顺序排列就可以使用列号…只需使用第一列或第一列。

1
ROW_NUMBER() OVER (ORDER BY 1)