只执行一次存储过程,硬编码值
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
问题:
如何在编排中硬编码 BiztalkPackageID
值?所以存储过程执行一次,就知道要传哪个值了。
如何在编排中只执行一次存储过程?
好吧,这些问题没有多大意义。您可能需要提供更多详细信息。
好吧,你就是这样。您如何制作请求消息?
只调用一次。为什么会出现调用不止一次的情况
抱歉,我不得不提醒您查询跟踪数据库更容易。另外,您是否考虑过在内部记录每个存储过程?我会考虑更正确的解决方案。
创建存储过程调用 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 (...)
。
还有其他几种方法可以在编排中构造消息,但我发现对于像这样的小场景,这是最直接的处理方式。
我有 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
问题:
如何在编排中硬编码
BiztalkPackageID
值?所以存储过程执行一次,就知道要传哪个值了。如何在编排中只执行一次存储过程?
好吧,这些问题没有多大意义。您可能需要提供更多详细信息。
好吧,你就是这样。您如何制作请求消息?
只调用一次。为什么会出现调用不止一次的情况
抱歉,我不得不提醒您查询跟踪数据库更容易。另外,您是否考虑过在内部记录每个存储过程?我会考虑更正确的解决方案。
创建存储过程调用 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 (...)
。
还有其他几种方法可以在编排中构造消息,但我发现对于像这样的小场景,这是最直接的处理方式。