Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server Oracle到SQL Server:返回的行集有限的动态查询_Sql Server_Database_Oracle_Row Number_Rownum - Fatal编程技术网

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

Sql server Oracle到SQL Server:返回的行集有限的动态查询,sql-server,database,oracle,row-number,rownum,Sql Server,Database,Oracle,Row Number,Rownum,我有一个即使不是不可能也很难解决的问题要问。我有一个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

我有一个即使不是不可能也很难解决的问题要问。我有一个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查询,将resultset命名为Internal_uuC3P_u查询,并从中选择所有内容以及rownum。然后,它按rownum:>@offset和按部分排序的行数只需要一列,否则如何排序

如果原始是随机顺序,那么只需在查询中选择一个随机列,就像第一个一样。在ORDER BY中,您可以使用列编号。。。只需使用第一列或数字1

ROW_NUMBER() OVER (ORDER BY 1) 

虽然我对这种方法有很多保留意见,特别是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))

不幸的是,由于排序列从未更改,如果您试图将其用于分页,则无法保证在重复执行时始终将相同的行数分配给相同的行。

我怎么没有想到这一点?这很简单,没有弄明白这一点让我很沮丧。谢谢你,好人!与我在回答中所述的警告相同:如果您选择的列在返回的行集中没有唯一的值,那么您无法确定重复执行时是否会分配相同的行号,这是分页使用的问题。@RBarryYoung是的,这是正确的,而且,它甚至不起作用。我刚刚测试了它,结果是:加窗函数和函数的下一个值不支持整数索引作为ORDER BY子句表达式。哦,没错,在允许OVER ORDER BY的列表达式上有一些模糊的限制。。,这就是为什么我总是使用SELECT NULL技巧。您应该知道,这种查询极易受到SQL注入攻击。@RBARYYOUNG是的,我理解,但感谢您的警告。Oracle是否保证rownum始终相同?@Hogan不确定,它认为如果子查询本身的顺序是唯一的,则可能会如此。我知道一个事实,SQL Server不保证内部订单BY的订购,除非涉及TOP条款。