我想在服务代理队列激活的存储过程中调用CLR,但这样做会导致队列被禁用 - POISON_MESSAGE_HANDLING (STATUS = ON)
。
基本上,CLR只是调用web服务来发布它收到的数据。
我是否需要首先获得许可?
答案 0 :(得分:1)
The activated proc '[dbo].[ProcessOrders]' running on queue 'App01.dbo.InstTargetQueue' output the following: 'Could not find stored procedure 'dbo.ProcessOrders
此错误表示队列配置了一个从数据库中删除的存储过程。你能仔细检查一下这个程序吗?也许你有一个错字,例如。一个额外的空间,在队列配置中?运行select * from sys.service_queues
并仔细检查激活的过程名称是否与您期望的完全相同。运行select * from sys.procedures
并确保该过程存在并按预期命名。
回答有关CLR的问题:首先,我建议您将Web服务调用移到数据库之外。使用外部流程服务监视队列,并从流程发布Web服务调用,而不是从数据库内部发布。
如果你坚持从SQLCLR调用webservices,那么这就是你需要知道的:
因此,您需要退出激活过程的沙盒环境,这可以通过将数据库标记为TRUSTWORTHY来完成,也可以通过签署过程来完成,请参阅Signing an activated procedure。但是现在你的问题似乎是一个简单的名称不匹配。
如果您将您的网络服务保留在SQLCLR内(我强烈反对),那么请阅读Thread.BeginThreadAffinity()
和ServicePointManager.DefaultConnectionLimit
(第二个也适用于外部流程,而不仅仅是SQLCLR)。 / p>