Триггеры и отключение сообщения «затронуты строки» - PullRequest
2 голосов
/ 13 января 2011

У меня есть триггер типа ВМЕСТО вставки, обновления. Это выглядит примерно так:

IF EXISTS(some select staement) 
 updade
 set
 where
 ELSE IF (some other select staement)
    insert
    values
 ELSE--(3)
RAISERROR ('msg',16,1)
RETURN; SET NOCOUNT ON;

Проблема заключается в том, что в 3-й опции «else» я хотел бы показывать только сообщение об ошибке без каких-либо сообщений «затронуты строки». SET NOCOUNT ON не работает для меня. Я уже пробовал разные конфигурации, ставлю с и без возврата. Я был помещен это везде в моем заявлении. Это нигде не работает. Я использую SQL Server 2005 Кто-нибудь может мне помочь, пожалуйста? Ряды пораженного массажа должны появляться всегда. Единственное исключение - оператор else.

Ответы [ 2 ]

6 голосов
/ 13 января 2011

Используйте SET NOCOUNT ON; перед запросом, а затем используйте GO

SET NOCOUNT ON;
GO
3 голосов
/ 13 января 2011

В упрощенном примере:

create table T (
    ID int not null
)
go
create trigger TT
on T
instead of insert
as
    RAISERROR('No',16,1)
go
insert into T (ID)
select 1

Получаем вывод:

Msg 50000, Level 16, State 1, Procedure TT, Line 5
No

(1 row(s) affected)

Единственный способ подавить сообщение «1 строка затронута» - откатить транзакцию (включая ROLLBACK после сообщения об ошибке). И это будет генерировать это вместо:

Msg 50000, Level 16, State 1, Procedure TT, Line 5
No
Msg 3609, Level 16, State 1, Line 1
The transaction ended in the trigger. The batch has been aborted.

Нет способа подавить эти сообщения дальше. Сообщение «1 строка затронута» генерируется во внешней области (области, в которой выполняется оператор INSERT), а не в области действия триггера, и генерируется, потому что триггер работает до завершения - до тех пор, пока внешнее утверждение касается, оно было успешным.

Обычный совет по NOCOUNT - использовать его для подавления дополнительных количеств строк, возвращаемых из триггера. Если вы используете его для этого, это должен быть первый оператор в теле триггера. В вашем примере это последнее утверждение, которое в любом случае не будет иметь никакого эффекта.

...