一直不學無術,所以也就一直懵懵懂懂。
之前有朋友問起以下代碼怎麼不行:
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