2011-11-30 49 views
1

給定任何SELECT語句,我想用skip和take操作符來包裝它。用skip/take操作符包裝任何SQL Server 2008語句

例如,對於甲骨文我創造了這個功能:

public override string WrapSelectSqlWithPagination(string sql, int skipRows, int numberOfRows) 
{ 
    string innerSql = String.Format("select /* FIRST_ROWS(n) */ a.*, ROWNUM rnum from ({0}) a where ROWNUM <= {1}", sql, skipRows + numberOfRows); 
    return String.Format("select * from ({0}) where rnum > {1}", innerSql, skipRows); 
} 

它完美。

我想爲SQL Server做同樣的事情,有可能嗎?

請注意,我對提前排序並不知情。

謝謝。

+0

我發現了這個SO的好鏈接,我希望與您需要的重疊?! http://stackoverflow.com/questions/548475/efficient-way-to-implement-paging – SGB

+1

你知道'TOP'子句沒有'ORDER BY'沒有關係嗎? SQL中沒有保證的順序。 – JNK

+0

是的,我知道。但是誰需要關心它是調用函數的人,而不是我:) – andrecarlucci

回答

2

您可以使用此sql模板來獲取SQL的所需記錄範圍。

WITH [AnyVariable] AS 
(
select * ,ROW_NUMBER() over(order by [Col1]) AS 'RowNum' 
    from [Table1] 
) 
SELECT * FROM [AnyVariable] 
WHERE RowNum BETWEEN 3 AND 6 

只要用你的東西替換[]中的東西。請記住刪除[]。然後在上面的方法中使用它。

+0

此解決方案不起作用,因爲它需要提前知道用於排序的列:( – andrecarlucci

+0

@andrecarlucci - 我在更新之前提供了此解決方案你的問題,查看問題更新的時間和我回答的時間,我可以很快更新答案。 –

-1

好的,我明白了。它可能非常緩慢,但它的工作原理:

public override string WrapSelectSqlWithPagination(string sql, int skipRows, int numberOfRows) { 
     Regex regex = new Regex("SELECT", RegexOptions.IgnoreCase); 
     sql = regex.Replace(sql, "SELECT TOP 2147483647 ", 1); 

     string innerSql = 
      @"select * into #TempTable from (
         select * ,ROW_NUMBER() over(order by aaa) AS rownum from (
          select 'aaa' as aaa, * from (
           {0} 
          )as t1 
         )as t2 
        ) as t3 
       where rownum between {1} and {2} 
       alter table #TempTable drop column aaa 
       alter table #TempTable drop column rownum 
       select * from #TempTable 
       drop table #TempTable 
      "; 
     return String.Format(innerSql, sql, skipRows+1, skipRows + numberOfRows); 
    } 

有沒有更好的方法來做到這一點?

相關問題