一直不學無術,所以也就一直懵懵懂懂。
之前有朋友問起以下代碼怎么不行:
set @rowcount = 10;
select top @rowcount * from table
這個是因為,TOP 只接受常量做數量參數,而不能接受變量,給對方提供的解決方案是:
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)
於是醍醐灌頂,對朋友的問題得出新的解決方案:
set @rowcount = 1;
set rowcount @rowcount
SELECT * FROM table