CLR存储过程由代理队列激活以发布到Web服务

时间:2016-03-10 15:33:05

标签: sql-server clr sqlclr service-broker

我想在服务代理队列激活的存储过程中调用CLR,但这样做会导致队列被禁用 - POISON_MESSAGE_HANDLING (STATUS = ON)

基本上,CLR只是调用web服务来发布它收到的数据。

我是否需要首先获得许可?

1 个答案:

答案 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>