Подсчет количества удаленных строк в хранимой процедуре SQL Server

StackOverflow https://stackoverflow.com/questions/174143

Вопрос

В 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. Возможно, вы ошибочно принимаете возвращаемое значение процедуры за число строк?

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top