Я сталкиваюсь с периодически возникающей ошибкой триггера SQL Server, который ставит меня в тупик, потому что кажется, что я делаю все правильно, чтобы предотвратить возникновение ошибки.Я получаю сообщение об ошибке: «Триггер возвратил набор результатов и / или работал с параметром SET NOCOUNT OFF, в то время как активен другой выдающийся набор результатов».Я выполнил поиск в Интернете и нашел некоторые вещи, которые я применил к своему триггеру, которые, как я думал, могли бы решить проблему, но, похоже, это не так.Это проблема, которая случается нечасто, но достаточно, чтобы быть проблемой.Однако я не смог сказать, почему это происходит.Вот пример того, как выглядит этот триггер:
CREATE TRIGGER [dbo].[trgAppointmentLogDispatch] ON [dbo].[Appointment] FOR INSERT, UPDATE, DELETE
AS
BEGIN
SET NOCOUNT ON
IF EXISTS (SELECT 1 FROM inserted) BEGIN
INSERT INTO DispatchQueue (ObjectType, CompanyID, KeyField1, KeyField2, KeyField3, KeyField4, KeyField5, Deleted, DateChanged)
SELECT 'Appointment', ISNULL(i.CompanyID, 0), ISNULL(i.OrderID, -1), ISNULL(i.AppointmentID, -1), NULL, NULL, NULL, 0, GETUTCDATE()
FROM inserted i
LEFT JOIN deleted d
ON i.AppointmentID = d.AppointmentID
WHERE ISNULL(i.Field1, '') <> ISNULL(d.Field1, '')
OR ISNULL(i.Field2, '') <> ISNULL(d.Field2, '')
OR ISNULL(i.Field3, 0) <> ISNULL(d.Field3, 0)
OR ISNULL(i.Field4, '1/1/2000') <> ISNULL(d.Field4, '1/1/2000')
OR ISNULL(i.Field5, '1/1/2000') <> ISNULL(d.Field5, '1/1/2000')
OR ISNULL(i.Field6, 0) <> ISNULL(d.Field6, 0)
OR ISNULL(i.Field7, '') <> ISNULL(d.Field7, '')
OR ISNULL(i.Field8, '') <> ISNULL(d.Field8, '')
END ELSE BEGIN
INSERT INTO DispatchQueue (ObjectType, CompanyID, KeyField1, KeyField2, KeyField3, KeyField4, KeyField5, Deleted, DateChanged)
SELECT 'Appointment', ISNULL(CompanyID, 0), ISNULL(OrderID, -1), ISNULL(AppointmentID, -1), NULL, NULL, NULL, 1, GETUTCDATE()
FROM deleted
END
SET NOCOUNT OFF
END
GO
Все, что делает триггер - это прослушивает изменения набора полей в таблице с именем Appointment (или для удаления записи в этой таблице),Если происходит удаление или изменение полей, которые проверяются в предложении WHERE, он вставляет новую запись в таблицу DispatchQueue, которая используется отдельным процессом, не относящимся к данной проблеме.
При поиске решений этой проблемы ранее общий консенсус, который я пришел к этому, звучал так, как будто бы он решил проблему, состоит в том, чтобы добавить команду SET NOCOUNT ON в начало моего триггера и добавить команду SET NOCOUNT OFF впоследняя строка моего триггера.Это не сработало в этом случае, поэтому я озадачен тем, где искать дальше.
Устранит ли проблему удаление команды SET NOCOUNT OFF в конце?Мне интересно, может ли это быть, потому что в трассировке SQL, которая показала, что проблема возникла, об ошибке сообщалось сразу после выполнения инструкции SET NOCOUNT OFF.Если это так, это может привести к другим потенциальным проблемам?Не похоже, что мой триггер возвращает Resultset (он просто запускает оператор EXISTS, чтобы проверить, проверяет ли я вставку или удаление, а затем выполняет оператор INSERT, чтобы вставить данные в другую таблицу), номожет ли это быть где-то (или каким-то образом), что я не вижу или не понимаю?
Может ли что-то еще происходить в базе данных вне моего триггера, вызывать сообщение об этой проблеме при запуске?
Я ценю любую проницательность.Пожалуйста, дайте мне знать, могу ли я предоставить дополнительную информацию по этому вопросу.