Подтвердить что ты не робот

Подсчет количества удаленных строк в хранимой процедуре 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

это действительно не с синтаксической ошибкой.

Любые идеи?

4b9b3361

Ответ 1

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

Ответ 2

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

Ответ 3

Просто сделайте следующее:

SET NOCOUNT off ;
SELECT @p1 = @@ROWCOUNT

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

Ответ 4

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

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

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

Ответ 5

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

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

select count(distinct datefield)
from #doomed

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

Ответ 6

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

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

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

Ответ 7

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