Должен ли @@ rowcount сохраняться из триггера в процесс его вызова? - PullRequest
0 голосов
/ 08 февраля 2012

Другими словами, если у меня есть триггер, который вызывает процедуру; я должен быть в состоянии проверить @@rowcount в первой строке процесса? И должно ли @@rowcount иметь значение на основе последнего SQL-выражения, выполненного в триггере?

Я отлаживаю процесс, который я не написал. Первая строка процедуры -

if @@rowcount=0
RETURN

Процесс вызывается триггером. Последнее, что триггер делает перед вызовом процедуры, это:

INSERT INTO #temp_table (some fields...)
SELECT some fields.. FROM inserted

EXEC SOMEPROC

Происходит следующее: @@rowcount в процедуре всегда равен 0, и процедура заканчивается до того, как он что-либо делает. Исправить это довольно легко, потому что я просто переместил проверку @@rowcount в триггер и вынул ее из процедуры.

Но мне любопытно, почему это было написано именно так. Почти как раньше работало, а теперь нет? Я просто хотел проверить и посмотреть, возможно ли было какое-то изменение в поведении между SQL2005 и SQL2008 или какие-то системные настройки, которые были перевернуты. Или один из моих предшественников просто написал плохой код, который никогда не работал?

1 Ответ

0 голосов
/ 08 февраля 2012

Я не люблю использовать @@ROWCOUNT для проверки состояния триггера. Слишком много других операторов в процедуре и между ними может сбросить это значение до 0.

Например:

SELECT TOP (10) name FROM sys.objects;
SET ANSI_NULLS ON;
SELECT @@ROWCOUNT;
----
0

Скорее, я бы проверил псевдотаблицы inserted / deleted. Итак, для триггера вставки или обновления:

IF EXISTS (SELECT 1 FROM inserted)
BEGIN
  ...

Для триггера удаления:

IF EXISTS (SELECT 1 FROM deleted)
BEGIN
  ...
...