首页 文章

Oracle到SQL Server:返回有限行集的动态查询

提问于
浏览
1

我有一个困难(如果不是不可能)的问题要求解决方案 . 我有一个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查询,并返回有限的行集,例如从第10行到第20行 .

现在,我的工作是将其转换为T-SQL . 我花了一天半时间查找每个可能的想法,但到目前为止,我还没有使用 ROW_NUMBER() 函数,因为它在 OVER() 子句中至少需要一个列,我不能提供任何一个,因为实际的查询是仅在运行时确定 .

你们有任何想法,或者在DB方面真的不可能做到吗?

提前致谢!

加布

2 回答

  • 2

    虽然我对这种方法有很多保留意见,特别是对于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分配给同一行 .

  • 1

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

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

    ROW_NUMBER() OVER (ORDER BY 1)
    

相关问题