2009-11-04 74 views
1

有誰知道限制使用類型TableAdapter時返回的行數的最佳方法嗎?選項似乎是:叫我的TableAdapter方法之前,然後set rowcount 0 aftwards set rowcount X使用TableAdapter返回的限制行(鍵入的數據集)

  1. 通行證「頂X」作爲參數(不能開始,我們就SQLS2008
  2. 發行動態SQL語句做到這一點
  3. 其他我還沒有想過的東西:)。

非常感謝提前。

回答

2

您可以使用TOP N,但你必須把括號它像這樣:

SELECT TOP (100) * FROM ... 

您也可以參數化,如下所示:

DECLARE @count INT 
SET @count = 100 
SELECT TOP (@count) * FROM field_company 
+0

如果您可以更新此值使參數值100,您可以有一個點:P – 2009-11-04 14:05:55

0

我使用參數化存儲過程來實現這一點。

 
create procedure dbo.spFoo 
    @NoOfRows int = 200 

AS 


declare @sql varchar(2000) 
select @sql = 
'select top ' + Cast(@NoOfRows as varchar) + ' * FROM Foo' 

exec(@sql) 

+0

嗯,我不幸的是,我不打算使用存儲過程。另外,你確定你可以參數化SQL Server 2005中的「TOP」的值,即使是在存儲過程中? – 2009-11-04 13:38:40

+0

所以我們現在知道;) – Saar 2009-11-04 14:22:11

0

我找到了更好的方法。

你不能參數化「TOP」值,但你可以參數化「SET ROWCOUNT X」值。

因此,這個工程:

create procedure test_SelectTopFromTable (@rowCount int) as 
begin 
    set rowcount @rowCount 
    select * from table 
    set rowcount 0 
end 

exec test_SelectTopFromTable 100 

不過,我確實需要處理異常情況發生,這將阻止set rowcount 0聲明運行。我會繼續挖掘。

UPDATE
我的老闆告訴我,使工作(和它是如此簡單,我有點不好意思),但辦法,我一定要得到他後他的回答,而不是使它看起來像我自己找到了。 :)

1

這對我來說工作正常。

SELECT DISTINCT TOP (@count) FLD1, FLD2 FROM mytable WITH (nolock) 

該參數與TableAdapter中的任何其他人一起生成。

0

TableadApter使用SqlDataAdapter,其中已具有此功能

怎麼辦:

點擊填充()FillByXXX()方法

myTradesTableAdapter.Fill(...) 

按F12 - 它會帶給你產生了源代碼由設計師。 複製這種方法。

轉到DataSet設計器中,單擊表適配器,按F7 - 這將創造/開放代碼的TableAdapter的命名空間。

粘貼fill()方法在這裏修改它有些像下面的例子中:

namespace MyApp.DsMyDataTableAdapters { 

public partial class MyTradesTableAdapter 
{ 
    //// copy-paste method from generated Fill() 
    //// and make new name: Fill() ==> FillTop() 
    //// use the same params and add new one: int topN 
    public virtual int FillTop(   // 
     DsMyData.MyTradesDataTable dataTable, 
     int someParameterId, 
     // ... 
     int topN) // add new param 
    { 
     // original code: 
     this.Adapter.SelectCommand = this.CommandCollection[0]; 
     this.Adapter.SelectCommand.Parameters[1].Value = someParameterId; 

     if ((this.ClearBeforeFill == true)) 
     { 
      dataTable.Clear(); 
     } 


     // modified code 
     int returnValue = 0; 
     if (topN > 0)     // validate topN 
     { 
      // get topN rows 
      returnValue = this.Adapter.Fill(0, topN, dataTable); 

     } 
     else 
     { 
      // get all rows (original code) in case topN = 0 or negative 
      returnValue = this.Adapter.Fill(dataTable); 
     } 
     return returnValue; 
    } 

    // .... 
} 

,然後你可以使用它爲:

int somePrm = 123; 
myTradesTableAdapter.Fill(ds.myTradesTable, somePrm) // original - get all rows 
myTradesTableAdapter.FillTop(ds.myTradesTable, somePrm, 100) // new - get 100 rows