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