Подсчет количества удаленных строк в хранимой процедуре SQL Server - PullRequest
46 голосов
/ 06 октября 2008

В 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 ]

51 голосов
/ 06 октября 2008

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

10 голосов
/ 06 октября 2008

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

7 голосов
/ 11 января 2014

Просто сделайте это:

SET NOCOUNT off ;
SELECT @p1 = @@ROWCOUNT

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

5 голосов
/ 06 октября 2008

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

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

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

1 голос
/ 11 марта 2015

Я обнаружил случай, когда вы не можете использовать @@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 голосов
/ 08 октября 2008

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

0 голосов
/ 06 октября 2008

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

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

Удалить из таблицы, где находится идентификатор (выберите идентификатор из временной таблицы)

...