Подсчет количества удаленных строк в хранимой процедуре SQL Server

в SQL Server 2005 есть ли способ удалить строки и узнать, сколько было на самом деле удалил?

Я могу 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

этот на самом деле не удается с синтаксической ошибкой.

какие идеи?

7 ответов


ты пробовал SET NOCOUNT OFF?


Я использую @@ROWCOUNT для этой цели в SQL2000 без проблем. Убедитесь, что вы не случайно сбрасываете этот счетчик, прежде чем проверять его (BOL: "эта переменная установлена в 0 любым оператором, который не возвращает строки, например, оператор IF").


просто сделать это:

SET NOCOUNT off ;
SELECT @p1 = @@ROWCOUNT

где p1-выходной параметр, заданный в хранимой процедуре. Надеюсь, это поможет.


в вашем примере @@ROWCOUNT должно работать-это правильный способ узнать количество удаленных строк. Если вы пытаетесь удалить что-то из своего приложения, вам нужно будет использовать SET NOCOUNT ON

по данным MSDN @@ROWCOUNT функция обновляется, даже если SET NOCOUNT включен как SET NOCOUNT влияет только на сообщение, которое вы получите после выполнения.

Итак, если вы пытаетесь работать с результатами @@ROWCOUNT из, например, ADO.NET тогда SET NOCOUNT ON должны определенно помочь.


я нашел случай, когда вы не можете использовать @@rowcount, например, когда вы хотите знать четкое количество значений, которые были удалены, а общее количество. В этом случае вам придется сделать следующее:

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

select count(distinct datefield)
from #doomed

синтаксическая ошибка в OP заключалась в том, что output не содержит deleted до datefield имя поля.


из любопытства, как вы называете процедуру? (Я предполагаю, что это хранимая процедура?). Причина, по которой я спрашиваю, заключается в том, что существует разница между возвращаемым значением хранимой процедуры (которое в этом случае будет 0) и результатом набора строк, который в этом случае будет одной строкой с одним столбцом. В ADO.Net бывший будет доступен параметр и последний объект sqldatareader. Возможно, вы ошибочно принимаете возвращаемое значение процедуры за счетчик строк?


создать временную таблицу с одним столбцом, id.

вставить во временную таблицу, выбрав идентификаторы, которые вы хотите удалить. Это дает вам ваш счет.

удалить из таблицы, где id в (выберите id из таблицы temp)