SQL里ROWCOUNT的使用


一直不學無術,所以也就一直懵懵懂懂。

 

之前有朋友問起以下代碼怎么不行:

 

declare  @rowcount  int;
set  @rowcount  =  10;
select  top  @rowcount  *  from  table

 

這個是因為,TOP 只接受常量做數量參數,而不能接受變量,給對方提供的解決方案是:

 

declare  @sql  nvarchar( 4000);
set  @sql  =  ' select top  '  +  convert( varchar( 10),  @rowcount+  '  * from table '

exec( @sql)

 

剛在博問里,人問起 rowcount 的用法,查了下,文檔里是這樣說的:

 

 



使 SQL Server 在返回指定的行數之后停止處理查詢。

主題鏈接圖標 Transact-SQL 語法約定

語法


SET ROWCOUNT { number | @number_var } 

參數

number | @ number_var

在停止特定查詢之前要處理的行數(整數)。

注釋

重要提示:
在 SQL Server 的下一個版本中,使用 SET ROWCOUNT 將不會影響 DELETE、INSERT 和 UPDATE 語句。請不要在新的開發工作中將 SET ROWCOUNT 與 DELETE、INSERT 和 UPDATE 語句一起使用,並應准備修改當前使用它的應用程序。另外,對於當前使用 SET ROWCOUNT 的 DELETE、INSERT 和 UPDATE 語句,建議您使用 TOP 語法重寫它們。有關詳細信息,請參閱 DELETE (Transact-SQL)、INSERT (Transact-SQL) 或 UPDATE (Transact-SQL)。

對於在遠程表和本地及遠程分區視圖上執行的 INSERT、UPDATE 和 DELETE 語句,將忽略 SET ROWCOUNT 選項設置。

要將此選項設置為 off 以便返回所有的行,請將 SET ROWCOUNT 指定為 0。

注意:
設置 SET ROWCOUNT 選項將使大多數 Transact-SQL 語句在受到指定數目的行影響后停止處理。這包括觸發器和 INSERT、UPDATE 及 DELETE 等數據修改語句。ROWCOUNT 選項對動態游標無效,但它可以限制鍵集的行集和不區分游標。應謹慎使用該選項,它主要與 SELECT 語句一起使用。

如果行數值較小,則 SET ROWCOUNT 將覆蓋 SELECT 語句 TOP 關鍵字。

當 INSERT、UPDATE 和 DELETE 語句使用顯式 TOP 表達式時,這些語句將忽略 SET ROWCOUNT。這包括 INSERT 后跟 SELECT 子句的語句。

SET ROWCOUNT 的設置是在執行時或運行時設置,而不是在分析時設置。

權限

要求具有 public 角色的成員身份。

示例

SET ROWCOUNT 在達到指定的行數后停止處理。請注意,在下面的示例中共有 545 行滿足 Quantity 小於 300 的條件。但是,從更新后返回的行數可以看出並非所有行都得到了處理。ROWCOUNT 影響所有的 Transact-SQL 語句。


復制代碼
USE AdventureWorks2008R2; GO SELECT count(*) AS Count FROM Production.ProductInventory WHERE Quantity < 300; GO

下面是結果集:

Count

-----------

537

(1 row(s) affected)

現在,將 ROWCOUNT 設置為 4,並以 Quantity 小於 300 的條件更新所有行。


復制代碼
SET ROWCOUNT 4; UPDATE Production.ProductInventory SET Quantity = 400 WHERE Quantity < 300; GO

(4 row(s) affected)

 



於是醍醐灌頂,對朋友的問題得出新的解決方案:

 

 

declare  @rowcount  int;
set  @rowcount  =  1;
set  rowcount  @rowcount

SELECT  *  FROM  table

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM