我有一个简单的Biztalk Application 2013-r2,它将文件导入表中,然后执行长时间运行的后导入过程(通过存储过程)。
症状:导入2个文件时
由于没有报告错误,这必须是一个设置,还是我需要将后处理移出长时间运行的交易?
详细说明:
后期处理存储程序:
CREATE PROCEDURE [sync].[MPostProcessing]
@Code NVARCHAR(2)
AS
----
---- 2. Normalize Address
----
IF @Code = '99'
EXEC sync.AElBatch @Code = @Code
CREATE PROCEDURE [sync].[AElBatch ] @Code AS VARCHAR(2)
AS
DECLARE @ID AS INT
WHILE EXISTS ( SELECT ID
FROM sync.[mtable]
WHERE Code = @Code
AND PostProcessingDone = 0 )
BEGIN
SELECT TOP 1
@ID = ID
FROM sync.[mtable]
WHERE Code = @Code
AND PostProcessingDone = 0
EXEC sync.PParse @ID = @ID
UPDATE sync.[mtable]
SET PostProcessingDone = 1
WHERE Code = @Code
AND ID = @ID
END
然后PPArse存储过程做得更多(所有工作,没有报告错误)
Biztalk服务器管理控制台的图像
答案 0 :(得分:1)
所以这个评论太长了,但我仍然不能100%肯定你的问题。无论哪种方式:
您的SP似乎可能存在一些问题。重构它们以使用基于集合的查询而不是while
循环(如果有的话,则使用游标)。强制SQL Server将每个单独的标量变量作为单独的调用进行处理将阻止它完全优化它在sync.PParse
中所做的任何事情 - 将表变量传递给它或者某些东西,如果你需要它可以正确并行化并停止它把事情搞糟了。
很可能sync.PParse
中有一个错误,它正在读取它不应该读取的数据。特别是来自AElBatch
的这些行令人不安:
SELECT TOP 1
@ID = ID
FROM sync.[mtable]
WHERE Code = @Code
AND PostProcessingDone = 0
您可能希望在某种类型中添加批处理标识符,以便PostProcessing#2不会开始拾取真正意义上的PostProcessing#1。
仔细检查sp_who2
发生的事情,看看事情是否被阻止。即使没有正确的错误出现,也可能会发生某些事情。
最后,如果这些都不起作用,您可能必须将它们放入BizTalk调用的单个SP中,以便Ordered Delivery
将两个作业保留在同一队列中 - 而不是允许文件加载#2到在完成后处理作业#1之前完成。