2015-06-16 3 views
0

Я создал сервис-брокер, который хранит идентификаторы в таблице очередей. Но проблема в том, когда я хочу вернуть идентификатор в хранимую процедуру, теперь он отформатирован как xml. Поскольку сообщение сервис-брокера является XML.SQL Service Broker

Как я могу получить последний идентификатор каждый раз, потому что триггер запускается после обновления строки.

Ниже мой код =>

/****** 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 в междунар. Если это так, то следующий должен сделать:

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 строк. Просто что-то принять во внимание.

Смежные вопросы