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。我花了一天半的时间寻找每一个可能的想法,但到目前为止,我还没有成功。我试了很多东西,但都没用。问题是,我不能使用
你们有什么想法吗,或者在数据库方面真的不可能吗?
事先谢谢!
加布
虽然我对这种方法有很多保留意见,尤其是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) |