2008-10-06 35 views
42

在SQL Server 2005中,有沒有一種刪除行的方法,並被告知有多少個被刪除的實際上是統計SQL Server存儲過程中被刪除的行的數量

我可以做一個select count(*)具有相同的條件,但我需要這是完全可信的。

我的第一個猜測是使用@@ROWCOUNT變量 - 但沒有設置,例如,

delete 
from mytable 
where datefield = '5-Oct-2008' 

select @@ROWCOUNT 

總是返回0

MSDN暗示OUTPUT結構,例如

delete from mytable 
where datefield = '5-Oct-2008' 
output datefield into #doomed 

select count(*) 
from #doomed 

這實際上失敗並出現語法錯誤。

任何想法?

回答

47

你試過SET NOCOUNT OFF

+0

我以爲我曾試過這個 - 但顯然我沒有,因爲它像魅力一樣工作 - 謝謝。 – Unsliced 2008-10-06 13:07:48

0

用一列id創建臨時表。

插入臨時表中選擇您要刪除的ID。這給了你數量。

從表中刪除其中id中(從臨時表中選擇ID)

+1

雖然有些東西可行,但像這樣的開銷是件浪費。 – 2008-10-06 13:40:31

+0

這確實會給性能帶來不好的影響,查詢會花費至少2倍的時間,如果您處理大量記錄,這可能會是相當長的時間。 儘管創造性思維! – 2013-07-19 14:35:31

3

在你的例子@@ROWCOUNT應該工作 - 這是找出一些刪除行的正確方法。如果你想刪除你的應用程序的東西,那麼你就需要使用SET NOCOUNT ON

根據MSDN @@ ROWCOUNT功能更新,即使SET NOCOUNT爲ON爲SET NOCOUNT只會影響你的執行後得到的消息。

因此,如果您嘗試使用來自例如ADO.NET的@@ROWCOUNT的結果,那麼SET NOCOUNT ON肯定會有所幫助。

8

在SQL2000中,我使用@@ ROWCOUNT來實現這個確切的目的,沒有任何問題。確保您在檢查它之前不會無意中重置此計數(BOL:'此變量被任何不返回行的語句設置爲0,例如IF語句')。

0

出於好奇,你打電話過程如何? (我假設它是一個存儲過程?)。我問的原因是存儲過程的返回值(在這種情況下爲0)和行集結果之間存在差異 - 在這種情況下,它將是具有單列的單行。在ADO.Net中,前者將由參數訪問,後者由SqlDataReader訪問。您是否可能將過程的返回值誤認爲行數?

7

只是這樣做:

SET NOCOUNT off ; 
SELECT @p1 = @@ROWCOUNT 

其中,P1是您在存儲過程中設置輸出參數。 希望它有幫助。

1

我發現一個案例,你不能使用@@rowcount,就像你想知道被刪除的值的不同數量而不是總數一樣。在這種情況下,你就必須做到以下幾點:

delete from mytable 
where datefield = '5-Oct-2008' 
output deleted.datefield into #doomed 

select count(distinct datefield) 
from #doomed 

在OP的語法錯誤是因爲output不包括deleteddatefield字段名之前。

相關問題