Подсчет количества удаленных строк в хранимой процедуре SQL Server
-
05-07-2019 - |
Вопрос
В 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
на самом деле это приводит к сбою из-за синтаксической ошибки.
Есть какие-нибудь идеи?
Решение
Вы пробовали ВЫКЛЮЧИТЬ ОТДЫХ
?
Другие советы
Я использую @@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
не содержал удаленный
перед именем поля datefield
.
Из любопытства, как вы называете процедуру? (Я предполагаю, что это хранимая процедура?). Причина, по которой я спрашиваю, состоит в том, что существует разница между возвращаемым значением хранимой процедуры (в данном случае равным 0) и результатом набора строк, который в этом случае будет одной строкой с одним столбцом. В ADO.Net к первому будет обращаться параметр, а ко второму - SqlDataReader. Возможно, вы ошибочно принимаете возвращаемое значение процедуры за число строк?
Создать временную таблицу с одним столбцом, идентификатор.
Вставьте в временную таблицу, выбрав идентификаторы, которые вы хотите удалить. Это дает вам ваш счет.
Удалить из таблицы, где находится идентификатор (выберите идентификатор из временной таблицы)