美好的一天。
接下来要做的主要任务是
在MSSQL 2012中具有数据库MonitorEDTest
和DecNet
的“某些”程序,我需要制作一个XML文件,其中包含该数据库中4-5个表的详细信息,该文件在{{ 1个条目的1}}变成StatusId
。
现在,我正在尝试像这样解决这个问题:
我使用StatusId列在表上进行了触发,因此当StatusId为150时会触发。使用光标将具有该状态的多个条目进行触发。
150
然后,此触发器使用过程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
然后我有两个想法,首先我尝试为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
。
此过程类似于人们通常从SB“接收”消息的方式,上面的代码。同样在该过程中,我从准备好的xml代码中获取一个标签activation procedure
,用于制作xml输出文件的名称,例如dbo.Que_Broker
〜g07
@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的知识,因为我是自己学习并从一些课程中学到的。