В упрощенном примере:
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 - использовать его для подавления дополнительных количеств строк, возвращаемых из триггера. Если вы используете его для этого, это должен быть первый оператор в теле триггера. В вашем примере это последнее утверждение, которое в любом случае не будет иметь никакого эффекта.