2011-06-03 80 views
4

我正在使用SET ROWCOUNT,因爲該值來自我的過程中的參數。使用SET ROWCOUNT安全嗎?

SET ROWCOUNT @take 

SELECT * FROM Something 

SET ROWCOUNT 0 

是否有可能另一個程序執行的同時,並獲得行數設置,或者是完全安全的使用它在存儲過程?

+0

是的,它是安全的。 – Hogan 2011-06-03 18:00:30

+2

你可以在頂部選擇一個變量。 'select top(@take)* from Something' – 2011-06-03 18:05:21

+1

Rowcount在SQL Server 2008中不推薦使用。如果您正在編寫新代碼,請不要使用rowcount,而應使用TOP代替。 – 2011-06-03 18:09:19

回答

7

Rowcount特定於您當前的範圍,因此您在此處安全。然而,聯機叢書告訴我的(這可能會或可能不會影響你的需求):

使用SET ROWCOUNT不會影響 DELETE,INSERT和UPDATE語句 在SQL Server的下一個版本。不要 不使用SET ROWCOUNT與DELETE,INSERT 和UPDATE語句在新 開發工作,並計劃修改當前使用它的應用程序 。 另外,DELETE,INSERT和UPDATE當前使用SET ROWCOUNT 陳述 ,我們建議您 重寫他們使用TOP語法。 有關詳細信息,請參閱DELETE (的Transact-SQL),INSERT(的Transact-SQL),或 UPDATE(的Transact-SQL)。

TOP也可以使用變量,現在可以在INSERT,UPDATE和DELETE語句中使用。 (嘿,我今天學到了一些新東西。)看看如何在線上在圖書中使用TOP與變量。

5

我加入這個答案的人的利益誰仍然可以搜索此。

它不再是安全使用SET ROWCOUNT,因爲它會在SQL Server的下一個版本中被廢止:

TechNet: Deprecated Database Engine Features

+0

雖然不完全棄用。從你的鏈接中可以看到'SET ROWCOUNT for INSERT,UPDATE和DELETE語句',所以SELECTS仍應該被支持。 – 2017-08-08 15:14:54

0

我使用它像這樣只能選擇所以它不會是但 棄用監控線程我需要從這個表中選擇所有未決行,但是,作爲 進程線程我只希望在同一時間 處理10行,但我不想麪條代碼在我的存儲過程因此在這裏我的解決方案:

個參數(@top INT = 0)

IF @TOP > 0 
    SET ROWCOUNT @TOP -- only put a cap on the select if we pass in the @top value 

- 選擇作爲正常 SELECT * FROM aTable - 要麼得到的所有行或獲取一個虛擬的 「頂(@top)」 - 例如:EXEC up_myProc @頂= 10 - 獲得前10名 - EXEC up_myProc @頂= 0 - 獲取所有行