Потратил день на поиски проблемы с неработающим SQL Service Broker, основной причиной которой была ссылка на базу данных в хранимой процедуре.
Например, это select
отлично работает в SQL Management Studio:
select [MyColumn] from [MyDatabase].[MySchema].[MyTable]
Однако это отклонено SQL Service Broker, поскольку мы ссылаемся на базу данных в операторе выбора, и обратный вызов из SqlDependency
возвращается с Invalid
в SqlNotificationEventArgs e
, см. http://msdn.microsoft.com/en-us/library/ms189308.aspx.
Изменение SQL, переданного в SqlDependency, для следующего оператора устранило ошибку:
select [MyColumn] from [MySchema].[MyTable]
Обновление
Приведенный выше пример является лишь одним из множества ограничений оператора SQL, от которых зависит SQL Service Broker. Полный список ограничений см. Каковы ограничения SqlDependency .
причина? Оператор SQL, который использует SQL Service Broker, за кадром преобразуется в инструкции для отслеживания изменений в базе данных Журнал транзакций SQL . Этот мониторинг выполняется в ядре SQL Server, что делает его чрезвычайно быстрым, когда дело доходит до обнаружения изменений в таблицах. Однако эта скорость обходится дорого: вы не можете использовать только какой-либо оператор SQL, вы должны использовать тот, который можно преобразовать в инструкции, чтобы отслеживать Журнал транзакций SQL .