从TSQL调用Web服务的最佳方法

时间:2010-04-21 13:23:48

标签: sql-server web-services sql-server-2005 tsql sql-server-2008

从TSQL调用Web服务的最佳方法是什么?我想写一些调用Web服务的触发器。是否有一个通常使用的最佳做法?

需要在SQL Server 2005和2008中处理实现

4 个答案:

答案 0 :(得分:6)

我知道你可以在SQL Server中嵌入.NET CLR代码,但是我是否知道是否可以从触发器调用CLR代码。 我想到了一个不同的体系结构,有一个表可以在你需要调用Web服务时插入记录,并运行一个外部应用程序来轮询表,并从那里调用Web服务。 如果您尝试直接在触发器内调用Web服务,那么您将在调试,错误日志记录等方面遇到很多麻烦。 我的2美分。

答案 1 :(得分:6)

从我听过的所有内容来看,从数​​据库中的任何地方进行网站调用都不是“最佳做法”,并且在触发器内进行网络呼叫会让我感到畏惧[延迟,延迟,阻塞,死锁...... oog]。数据库成为很好的后端,但前端非常差。使用专用应用程序进行网络和数据库协调可能会好得多。

将某些内容连接到SQL代理调用可能会有效,但请注意,在作业步骤中没有“本地”方式来调用网站。他们可能是故意设计的。

答案 2 :(得分:3)

正如这里已经提到的,从触发器调用Web服务会因为调用它所需的时间而终止数据库性能。

SQL Server确实有一个名为SQL Server Broker的功能,用于将异步消息传递到SQL Server。虽然我现在已经有了使用它的经验,但如果您希望将所有处理逻辑保留在SQL Server中,这可能是一个很好的起点。

如果可以,我建议将调用服务的责任转移到使用数据库的任何应用程序。在这个级别,您将能够在不占用数据库的情况下处理延迟。

答案 3 :(得分:1)

如@ Keith的回答所述,对网络服务进行全面调用可能非常糟糕。想象一下,Web服务已关闭,您已锁定大量更新并等待访问您的数据。您可以使用SQL Service Broker here is a good tutorial将它们与触发器一起使用。这是设置队列后的示例触发器代码。您始终可以创建一个服务来监视队列,并在需要时实际调用Web服务。

--Create trigger for update
CREATE  TRIGGER dbo.Trg_DepartmentMaster_Update 
    ON  dbo.DepartmentMaster FOR UPDATE 
AS BEGIN
    SET NOCOUNT ON;
    DECLARE @MessageBody XML  
    DECLARE @TableId int 

    --get relevant information from inserted/deleted and convert to xml message  
    SET @MessageBody = (SELECT DepartmentId,Name,Description FROM inserted FOR XML AUTO)

    If (@MessageBody IS NOT NULL)  
    BEGIN 
        DECLARE @Handle UNIQUEIDENTIFIER;   
        BEGIN DIALOG CONVERSATION @Handle   
        FROM SERVICE [TestServiceInitiator]   
        TO SERVICE 'TestServiceTarget'   
        ON CONTRACT [TestContract]   
        WITH ENCRYPTION = OFF;   
        SEND ON CONVERSATION @Handle   
        MESSAGE TYPE [TestMessage](@MessageBody);
    END
END