我有一个困难的(如果不是不可能的话)问题需要解决。我有一个 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()
子句中的一列,而我无法提供,因为实际查询仅在运行时确定。
你们有什么想法,或者在数据库方面真的不可能吗?
提前致谢!
加布
最佳答案
虽然我对这种方法持保留意见,尤其是针对 SQL 注入(inject)攻击,但以下方法应该有效:
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 分配给同一行。
关于sql-server - Oracle 到 SQL Server : dynamic query with limited rowset returned,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32785908/