2008-10-06 5 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

Создать таблицу temp с одним столбцом, id.

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

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

+1

Хотя что-то, что сработает, накладные расходы на что-то подобное - это отходы. – 2008-10-06 13:40:31

+0

Это дало бы плохую производительность, запрос потребовал бы как минимум в 2 раза дольше, что может быть значительным, если вы обрабатываете множество записей. Творческое мышление! – 2013-07-19 14:35:31

3

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

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

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

8

Я использую @@ ROWCOUNT для этой конкретной цели в SQL2000 без проблем. Убедитесь, что вы не случайно сбросили этот счет, прежде чем проверять его (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 не включают deleted перед именем datefield поля.

Смежные вопросы