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

Execute Stored Procedure only Once, hard code value

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

我很清楚 Biztalk 数据库会保留日志,因此请不要提供它作为解决方案。

我的table定义:

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. 如何在编排中只执行一次存储过程?

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

  1. 好吧,你就是这样。您如何制作请求消息?

  2. 只调用一次。为什么会出现调用不止一次的情况

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

创建存储过程调用 XML 消息的实例;因为这是一条非常小且简单的消息,所以我将它设置为模板,就像在 C# 帮助器中一样 class:

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 端处理此问题,坚持编排是否已经为该特定批次记录了一些内容(可能使用 anti-join,即 INSERT ... WHERE NOT EXISTS (...)

还有其他几种方法可以在编排中构造消息,但我发现对于像这样的小场景,这是最直接的处理方式。