2011-11-23 39 views
1

在我的应用程序中,我需要异步调用存储过程。 为此,我使用Sql Service Broker。 这些步骤涉及创建异步调用。异步调用存储过程使用服务代理

1)我创建了Message,Contract,Queue,Service。 并发送messages.I可以在'ReceiveQueue1'中看到我的消息。

2)我创建了一个存储过程和队列 当我执行存储过程(proc_AddRecord)时,它只执行一次。 它读取队列中的所有记录并将这些记录添加到表中。 012pt高兴这一点它的工作正常。 但是,当我向'ReceiveQueue1'添加一些新消息时,我的存储过程不会自动将这些 记录添加到表中。我必须重新执行存储过程(proc_AddRecord) 以添加新消息。为什么Stored proc没有被执行。 我应该这样做,以便异步调用存储过程。 使用Service Broker的重点是异步调用存储过程。 我完全不熟悉SQL Server Service Broker。 感谢任何帮助。 这里是我的存储过程

--exec proc_AddRecord 

ALTER PROCEDURE proc_AddRecord 
AS 

Declare 
    @Conversation UniqueIdentifier, 
    @msgTypeName nvarchar(200), 
    @msg varbinary(max) 

While (1=1) 
Begin 
    Begin Transaction; 

    WAITFOR 
    (
     Receive Top (1) 
      @Conversation = conversation_handle, 
      @msgTypeName = message_type_name, 
      @msg = message_body 
     from dbo.ReceiveQueue1 
    ), TIMEOUT 5000 


    IF @@Rowcount = 0 
     Begin 
      Rollback Transaction 
      Break 
     End 
    PRINT @msg 
    If @msg = 'Sales' 
     BEGIN 
      insert into TableCity(deptNo,Manager,Group,EmpCount) VALUES(101,'Reeves',51, 29) 
      COMMIT Transaction 
      Continue 
     End 
    If @msg = 'HR' 
     BEGIN 
      insert into TableCity(deptNo,Manager,Group,EmpCount) VALUES(102,'Cussac',55, 14) 
      COMMIT Transaction 
      Continue 
     End 

    Begin 
     Print 'Process end of dialog messages here.' 
     End Conversation @Conversation 
     Commit Transaction 
     Continue 
    End 
    Rollback Transaction 
END 

ALTER QUEUE AddRecorQueue 
WITH ACTIVATION (
       PROCEDURE_NAME=proc_AddRecord, 
       MAX_QUEUE_READERS = 1, 
       STATUS = ON, 
       EXECUTE AS 'dbo'); 

回答

2

你说你是执行存储过程的代码,你不应该需要做的是,一次也没有,它应始终激活完成。

如果您的激活位于'ReceiveQueue1'而不是'AddRecorQueue',我无法看到其余代码,但名称显示它。

您的存储过程从哪里开始和结束?通常我会在存储过程应该结束的AS语句和END之后放置BEGIN,如果您没有这些,那么您需要使用GO语句将它分离出来。否则,您的ALTER QUEUE语句将成为存储过程的一部分

您还有“回滚事务”,因此即使激活正在工作,它也会全部回滚,或者提出错误,表示没有事务IF语句被触发。

我建议你关注一般this tutorial for service brokerthis one about internal activation。他们应该让你开始。

+0

非常好,我添加了激活到''ReceiveQueue1',它的工作完美。我在最后删除了回滚。谢谢你的帮助。 – Henry