Область @@rowcount?
Какова область действия @@rowcount
? MSDN не упоминает о своей области.
Возвращает количество строк, затронутых последним оператором.
Ok.
В моем SP - я вставляю в таблицу, которая имеет insert trigger
, которая делает другую вставку, когда новое значение вставляется в таблицу.
Вопрос:
В какой области будет отображаться @@rowcount
? (триггер или SP)?
Ответы
Ответ 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 влияет на него.... следовательно, его область действия - это последнее выражение, прочитанное.