代码之家  ›  专栏  ›  技术社区  ›  Gábor Major

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

  •  1
  • Gábor Major  · 技术社区  · 9 年前

    我有一个难题(如果不是不可能的话)需要寻求解决方案。我有一个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+@count。因此,实际上,它执行任何SQL查询,并返回有限的行集,例如从第10行到第20行。

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

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

    提前感谢!

    加布

    2 回复  |  直到 9 年前
        1
  •  2
  •   RBarryYoung    9 年前

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

        2
  •  1
  •   Hogan    9 年前

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

    如果原始数据是随机顺序,那么只需在查询中选择一个随机列(如第一列)。在ORDERBY中,您可以使用列编号……只需使用第一列或数字1。

    ROW_NUMBER() OVER (ORDER BY 1)