仅执行存储过程一次,硬编码值

时间:2016-01-05 19:00:19

标签: biztalk biztalk-2013r2

我有50个Biztalk包,我需要在包执行时登录一个单独的表。

我非常清楚Biztalk数据库会记录日志,因此不能将其作为解决方案提供。

我的表格定义:

CREATE TABLE [dbo].[BiztalkLog]
(
    [ID] [int] IDENTITY(1,1) NOT NULL,
    [BiztalkPackageID] [int] NULL,
    [RunDate] [datetime] NULL,

    CONSTRAINT [PK_BiztalkLog] 
       PRIMARY KEY CLUSTERED ([ID] ASC)
           WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, 
                 IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, 
                 ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]
GO

我的存储过程:

CREATE PROCEDURE [dbo].[InsertBiztalkLog]
    @BiztalkPackageID AS INT
AS 
    INSERT INTO dbo.BiztalkLog(BiztalkPackageID)
        SELECT @BiztalkPackageID
GO

问题:

  1. 如何在业务流程中对BiztalkPackageID值进行硬编码?因此,当存储过程执行一次时,它将知道要传递哪个值。

  2. 如何在业务流程中只执行一次存储过程?

2 个答案:

答案 0 :(得分:1)

创建存储过程调用XML消息的实例;因为这是一个非常小而简单的消息,所以我在C#帮助程序类中将其设置为模板:

public static string biztalkLogTemplate = @"<ns0:BiztalkLog xmlns:ns0=""http://schemas.microsoft.com/Sql/2008/05/Procedures/dbo"">
  <ns0:BizTalkPackageID>{0}</ns0:BizTalkPackageID>
</ns0:BiztalkLog>";

public static XmlDocument GetBiztalkLog(int packageId)
{
   XmlDocument xdoc = new XmlDocument();
   xdoc.LoadXml(string.Format(biztalkLogTemplate, packageId));
}

然后,在业务流程中添加一条消息(msgLogProc),设置为使用存储过程的模式,并在构造消息表达式中添加:

msgLogProc = GetBiztalkLog(1); // whatever ID this orchestration is supposed to use.

然后,您可以在业务流程中设置一个端口,并将其(直接或静态)绑定到SQL过程的发送端口。使用Send形状将msgLogProc发送到该端口。如果您在循环形状之前执行此操作一次,则只会在每次编排执行时调用该过程。如果你需要它只是一些不同的标准(只有第一次执行一天或一批?),你需要一个不同的模式。您可能希望在SQL端处理此问题,但是,如果业务流程已经为该特定批次记录了某些内容(可能使用反加入,即INSERT ... WHERE NOT EXISTS (...),则会持续存在。

在业务流程中还有其他几种构建消息的方法,但我发现这对于像这样的小方案来说是最直接的。

答案 1 :(得分:0)

嗯,这些问题没有多大意义。您可能需要提供更多详细信息。

  1. 嗯,你这么做。你是如何制作请求信息的?

  2. 只召唤一次。你为什么会遇到不止一次被召唤的情况。

  3. 抱歉,我必须提醒您查询跟踪数据库更容易。另外,您是否考虑过在内部记录每个存储过程?我会考虑更正确的解决方案。