Sql server 当关闭队列上的XML验证时,ServiceBroker激活输出“消息体可能不为空”

Sql server 当关闭队列上的XML验证时,ServiceBroker激活输出“消息体可能不为空”,sql-server,sql-server-2012,service-broker,Sql Server,Sql Server 2012,Service Broker,在2014 MS SQL Server上运行Service Broker从测试切换到live时产生新错误: 在队列“dbo.CalcPriceDataQueue”上运行的激活进程“[dbo].[usp_CalcPrice]”输出以下内容:“消息正文不能为NULL。允许使用长度为零的UNICODE或二进制字符串。” 与测试到实时版本的区别在于,[dbo].[usp_CalcPrice]中使用的消息类型不再具有VALIDATION=XML SCHEMA XXXXX,但对于性能而言,更改为VALIDA

在2014 MS SQL Server上运行Service Broker从测试切换到live时产生新错误:

在队列“dbo.CalcPriceDataQueue”上运行的激活进程“[dbo].[usp_CalcPrice]”输出以下内容:“消息正文不能为NULL。允许使用长度为零的UNICODE或二进制字符串。”

与测试到实时版本的区别在于,[dbo].[usp_CalcPrice]中使用的消息类型不再具有VALIDATION=XML SCHEMA XXXXX,但对于性能而言,更改为VALIDATION=NONE

我添加了一个表来转储存储过程[dbo].[usp_CalcPrice]从队列接收到的内容,这样做看起来很好:

  WHILE (1 = 1) 
  BEGIN -- Receive the next available message from the queue 
    WAITFOR ( 
             RECEIVE TOP(1)     
             @message_body = CAST(message_body AS XML),     
             @dialog = conversation_handle
        FROM [dbo].[CalcPriceDataQueue]), TIMEOUT 50    
        IF (@@ROWCOUNT = 0 OR @message_body IS NULL) 
        BEGIN 
            break
        END 
        ELSE 
        BEGIN 
            SET @XmlBody = CAST(@message_body AS Nvarchar(max))
            INSERT INTO dbo.SB_Tester (XmlBody)
            VALUES(@XmlBody)
            ...
在一个简单的测试中,队列会得到6-8k个条目,在测试服务器上,这些条目会在“没有时间”的情况下得到处理,没有错误,但在实时测试中,每个条目需要2-5秒,windows事件查看器会在每个条目上得到一个错误——上面的一个,在dbo.SB_测试仪中,我会为测试和实时测试中的队列中的每个条目获得一个漂亮的XML条目

其他信息:

@@版本:Microsoft SQL Server 2014-12.0.2254.0 X64 2014年7月25日18:52:51 微软公司版权所有 Windows NT 6.3 Build 9600上的64位企业版:

它们被维护,因此版本总是相同的

发送到队列的代码:

DECLARE @MessageBody XML
SET @MessageBody = N'<Calc 
                        PartId="'           + @PartId +'"
                        CustomerId="'       + @CustId + '"
                        PriceRuleId="'      + @RuleId + '"
                        BaseSalesPrice="'   + @BaseSalesPrice + '"
                        CostPrice="'        + @CostPrice + '"
                        MinDB="'            + @MinDB + '"
                        IgnoreMinDB="'      + @IgnoreMinDB + '"
                        NoPriceRaising="'   + @NoPriceRaising + '"
                        Priority="'         + @Priority + '"
                        TargetPrice="'      + @TargetPrice + '"
                        ChangeType="'       + @ChangeType + '"
                        Change="'           + @Change + '"
                    />'

--PRINT CONVERT(Nvarchar(max), @MessageBody)

IF (@MessageBody IS NOT NULL)  
    BEGIN 
        DECLARE @Handle UNIQUEIDENTIFIER;   
        BEGIN DIALOG CONVERSATION @Handle
        FROM SERVICE [PriceCalcServiceSource]
        TO SERVICE   'PriceCalcServiceSink'
        ON CONTRACT [CalcPriceDataContract]
        WITH ENCRYPTION = OFF;   
        SEND ON CONVERSATION @Handle   
        MESSAGE TYPE [PriceData](@MessageBody);
    END
在测试服务器上创建消息:

CREATE MESSAGE TYPE [PriceData]
VALIDATION = VALID_XML WITH SCHEMA COLLECTION dbo.PriceData
有人知道这个问题的原因吗?非常感谢您的帮助:


/Grue

我参加聚会有点晚了,但我和ServiceBroker也有同样的问题。当我们的大型机软件试图将数据插入SQL Server数据库时,插入操作被取消,日志文件显示了相同的消息。我从负责大型机的企业收到的建议是修改目标表上的触发器,以便在开始事务之前检查插入的信息是否存在。下面是我的触发器现在的样子:

将[dbo].[PEDIDO_COMPRA]上的[dbo].[OnPedidoCompraInserted]触发器更改为INSERT 像 开始 如果存在,请从插入中选择*这是他建议我添加的验证 开始 开始交易; 声明@ch UNIQUEIDENTIFIER 声明@messageBody NVARCHARMAX; 开始对话@ch 来自服务[InitPedidoCompraService] 服务“TargetPedidoCompraService” 合同上[http://ssb.csharp.at/PedidoCompraContract] 加密=关闭时; -构造请求消息 设置@messageBody=SELECT*from inserted FOR XML AUTO,ELEMENTS; -将消息发送到TargetService ;发送对话@ch 消息类型[http://ssb.csharp.at/RequestPedidoCompra]@messageBody; 犯罪 终止 终止
我知道我迟到了,但我希望我能在将来帮助别人。

看到这些东西会很有趣:1打印结果@版本;从这两个系统中,有2个实际代码在对话框上执行发送,还有3个实际创建消息类型脚本,它们应该是不同的。嘿,你们解决了上面的错误吗?嘿@grillazz-不,我使用了不同的技术方法:
CREATE MESSAGE TYPE [PriceData]
VALIDATION = VALID_XML WITH SCHEMA COLLECTION dbo.PriceData