2015-06-16 48 views
0

我已经创建了一个将ID存储在队列表中的服务代理。但问题是,当我想在存储过程中获取id时,它现在格式化为xml。因为服务代理消息是XML。SQL Service Broker

我怎样才能每次获得最后一个ID,因为在更新一行之后触发器被触发。

下面我的代码=>

/****** Object: Trigger [dba].[TriggerCall] Script Date: 6/16/2015 2:55:57 PM ******/ 

SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 
ALTER TRIGGER [dba].[TriggerCall] ON [dba].[CallID] FOR  UPDATE 
AS 

BEGIN 
    SET NOCOUNT ON; 
    DECLARE @MessageBody XML 
    DECLARE @ID varchar(50) 
    -- Insert statements for trigger here 

       --get relevant information from inserted/deleted and convert to xml message 
     SET @MessageBody = (SELECT Id 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 



/****** Object: StoredProcedure [dbo].[usp_GetCall] Script Date: 6/16/2015 2:44:27 PM ******/ 

SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 
ALTER PROCEDURE [dbo].[usp_GetCall] 
AS 
BEGIN 
DECLARE @message_type varchar(100) 
DECLARE @dialog uniqueidentifier, @message_body XML; 
Declare @Object as Int; 
Declare @URL as varchar(255) 
Declare @ResponseText as Varchar(8000); 
Declare @ID as Varchar(38); 

WHILE (1 = 1) 
     BEGIN -- Receive the next available message from the queue 
     WAITFOR ( 
        RECEIVE TOP(1) @message_type = message_type_name,  
        @message_body = CAST(message_body AS XML),  
        @dialog = conversation_handle 

     FROM dbo.TestQueue), TIMEOUT 500 if (@@ROWCOUNT = 0 OR @message_body IS NULL) 

     BEGIN 

        BREAK 
     END 
       ELSE 
        BEGIN 

INSERT INTO [dbo].[testtabel] 
     ([id] 
     ,[callid], 
     [test]) 
VALUES 
     ('111', '111', @message_body) 


        END 
     END CONVERSATION @dialog 
     END 
END 

回答

0

如果我正确理解你的问题,你只是看向ID补充水分成一个int。如果是这种情况,应该做以下事情:

use tempdb; 
create table inserted (id int); 
insert into inserted values (1); 
declare @message_body xml; 

set @message_body= (select * from inserted for xml auto); 
select @message_body.value('(/inserted/@id)[1]', 'int'); 

魔法是最后一行(其余的只是设置为我测试)。

虽然,我会借此机会澄清你似乎有的错误观念。 SQL服务器中的触发器不是每行都触发,而是每批触发。因此,如果您针对表执行更新并更新50行,触发器将被触发一次,插入(和删除)的表将包含50行。只是要考虑到一些事情。