【问题标题】:SQL Service BrokerSQL 服务代理
【发布时间】:2015-06-16 12:58:19
【问题描述】:

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

我怎样才能每次都获取最后一个 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

【问题讨论】:

    标签: sql-server database stored-procedures triggers


    【解决方案1】:

    如果我正确理解您的问题,您只是希望将 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 Server 中的触发器不是按行触发,而是按批次触发。因此,如果您对表运行更新并且它更新了 50 行,则触发器会被触发一次,并且插入(和删除)的表中将有 50 行。只是需要考虑的事情。

    【讨论】:

      猜你喜欢
      • 2011-09-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多