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

Область @@rowcount?

Какова область действия @@rowcount? MSDN не упоминает о своей области.

Возвращает количество строк, затронутых последним оператором.

Ok.

В моем SP - я вставляю в таблицу, которая имеет insert trigger, которая делает другую вставку, когда новое значение вставляется в таблицу.

Вопрос:

В какой области будет отображаться @@rowcount? (триггер или SP)?

4b9b3361

Ответ 1

Конечно, статья предназначена для SQL Server 2000, но можно надеяться, что область действия не изменится между версиями. Согласно статье Как триггеры влияют на ROWCOUNT и IDENTITY в SQL Server 2000, @@ROWCOUNT не будет влиять на триггеры.

В частности:

Безопасно использовать @@ROWCOUNT в SQL Server 2000, даже если в базовой таблице есть триггер. Триггер не будет искажать результаты; вы получите то, что ожидаете. @@ROWCOUNT работает корректно, даже если установлен NOCOUNT.

Итак, если вы обновите три строки, а триггер обновит пять строк в другом месте, вы получите @@ROWCOUNT из 3.

Кроме того, из ответа GBN в SQL Server - используется безопасный протокол @@ROWCOUNT для многопоточных приложений?:

@@ROWCOUNT является областью действия и безопасностью подключения.

Фактически, он считывает только последний счетчик строк для этого соединения и области.

Ответ 2

каждый оператор insert/update/select/set/delete сбрасывает @@rowcount в строки, затронутые выполненным оператором

begin
declare @myrowcount int,
    @myrowcount2 int
insert stmt
SET @[email protected]@rowcount
if @myrowcount>0
begin
insert stmt
SET @myrowcount2 [email protected]@rowcount
if @myrowcount2 >0
do smthg
end
end

или попробуйте это

 SELECT * FROM master.sys.objects -- 50 rows
    IF (1=1)
        SELECT @@ROWCOUNT AS RowsAffected -- 0, because the IF did not affect any rows

даже оператор IF влияет на него.... следовательно, его область действия - это последнее выражение, прочитанное.