sql-server - Oracle 到 SQL Server : dynamic query with limited rowset returned

标签 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 (@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/

相关文章:

sql-server - 使用 T-SQL 高效删除记录而不使用 IN 子句

java - 我该如何通过 Java 安全地连接到数据库?

sql - 冗余相似索引

php - MySQL - 将秒数舍入到最接近的半分钟

oracle - 在 Oracle 中通过数据库链接访问游标

python - 如何让 Django 连接到使用 AWS Lambda 层的 SQL Server?

sql - 如何从 JSON 字符串读取具有长值的属性?

sql-server - 合并声明和身份插入

oracle - r2dbc-oracle 背压实现与 fetchsize

oracle - flyway init oracle权限不足