Service Broker-触发输出xml文件的

时间:2018-07-17 08:13:25

标签: sql-server bcp service-broker

美好的一天。

接下来要做的主要任务是

在MSSQL 2012中具有数据库MonitorEDTestDecNet的“某些”程序,我需要制作一个XML文件,其中包含该数据库中4-5个表的详细信息,该文件在{{ 1个条目的1}}变成StatusId

现在,我正在尝试像这样解决这个问题:

  1. 我使用StatusId列在表上进行了触发,因此当StatusId为150时会触发。使用光标将具有该状态的多个条目进行触发。

    150
  2. 然后,此触发器使用过程ALTER TRIGGER [dbo].[DT_Update_NEW] ON [MonitorEDTest].[dbo].[LOG_DECL] FOR UPDATE AS BEGIN SET NOCOUNT ON; if exists (select * from inserted where StatusId = 150) begin declare @nd nvarchar (100), @ProcessId nvarchar (100) declare DTcursor cursor for select [ND], [ProcessId] from inserted open DTcursor; FETCH NEXT FROM DTcursor into @nd, @ProcessId WHILE @@FETCH_STATUS = 0 BEGIN exec dbo.DT_info_Broker @nd, @ProcessId FETCH NEXT FROM DTcursor into @nd, @ProcessId END CLOSE DTcursor deallocate DTcursor end END 使用dbo.DT_info_Broker语句创建完整的xml文件,然后该完整的xml代码与服务代理一起发送给自己(基于{{1}的ServiceBroker },其中包含用于触发的表,整个信息取自其他DB select...join..for xml)。

    MonitorEDTest
  3. 然后我有两个想法,首先我尝试为Service Broker(SB)创建DecNet,使其像从2发送xml的触发器一样,但是没有用,所以在发送之后到SB,我执行了另一个过程ALTER PROCEDURE [dbo].[DT_Info_Broker] @nd nvarchar (200), @ProcessId nvarchar (200) AS BEGIN SET NOCOUNT ON; declare @base nvarchar(100), @g07 nvarchar(1000), @sql nvarchar (MAX), @flag int, @code1 nvarchar (2000), @code2 nvarchar (1000), @code3 nvarchar (1000), @code4 nvarchar(1000), @code nvarchar(4000), @codeold nvarchar (1000), @bat nvarchar(1000), @pwshell nvarchar(1000), @batdel nvarchar(1000), @msg xml set @base = 'DecNet' set @msg = (SELECT (select.....)for xml path(''), root('DT')) declare @ch uniqueidentifier begin dialog conversation @ch from service Monitor to service 'Monitor' on contract [Monitor_Contract] with encryption = off select @ch, @nd, @g07, @msg ;send on conversation @ch message type [Monitor_Message] (@msg) EXEC [MonitorEDTest].[dbo].[Que_Broker] END

  4. 此过程类似于人们通常从SB“接收”消息的方式,上面的代码。同样在该过程中,我从准备好的xml代码中获取一个标签activation procedure,用于制作xml输出文件的名称,例如dbo.Que_Brokerg07

    @g07.xml

因此,主要问题是下一个,我在最后一个过程代码上写了一个代码,该代码转到SB的队列,并且当它的计数> 0时,它使10000000-170718-0000000.xml 然后对话结束。

当我检查其工作方式时,一切正常,但是bcp并未复制BS的任何条目,并且当我检查表队列中的消息时,消息仍然存在。当我尝试手动执行该过程时,bcp可以正常工作。

ALTER PROCEDURE [dbo].[Que_Broker] 
AS
BEGIN
    while 1 = 1
    begin
        declare @command nvarchar(2000), @xmlint int, @XmlText nvarchar(max), @g07 nvarchar (100)
        declare @count int, @ch uniqueidentifier, @retvalue bit --, @msgtype sysname, @body varbinary(max)

        select @count = count(*) from Monitor_Queue
        if (@count = 0) break

        set @xmlint = 0
        select top (1) @XmlText = cast(message_body as nvarchar(max)), @ch = conversation_handle from Monitor_Queue where message_type_name = 'Monitor_Message' order by conversation_handle
        exec sp_xml_preparedocument @xmlint OUTPUT, @XmlText
        select @g07 = [text] from OPENXML (@xmlint, 'DT', 1) where [parentid] = 4
        exec sp_XML_removedocument @xmlint
        set @g07 = (select replace (@g07, '/', '-'))
        set @command = 'bcp "receive top (1) cast(message_body as xml) from Monitor_Queue" queryout D:\' + @g07 + '.xml -T -x -c -C 1251 -d MonitorEDTest'
        select @command, @g07
        --waitfor delay '00:00:01'
        EXEC master..xp_cmdshell @command

        --break
        end conversation @ch with cleanup

    end
END

同样,在与SB达成想法之前,我曾尝试通过bcp “receive top (1) cast(message_body as xml) from Monitor_Queue”...queryout “*.xml”output ------------ NULL Starting copy... NULL 0 rows copied. Network packet size (bytes): 4096 Clock Time (ms.) Total : 1 NULL 在工作中创建动态步骤来做类似的事情,但是由于一次可以多次输入而没有用(例如更新前5个设置statusid = 150,其中statusid = 150)。下一个条目无法打开工作,因为第一个未完成。

对于某些错误,我们深表歉意,但是第一次在这里写书,希望能对我有所帮助,并学习更多有关使用sql的知识,因为我是自己学习并从一些课程中学到的。

0 个答案:

没有答案