使用 BizTalk Server 在 SQL Server 中执行具有 FOR XML 子句的存储过程

SQL SELECT 语句可以具有 FOR XML 子句,该子句将查询结果作为 XML 而不是行集返回。 您还可以有一个包含含有 FOR XML 子句的 SELECT 语句的存储过程。 FOR XML (SQL Server) 具有详细信息。

可以使用基于 WCF 的 SQL 适配器来执行此类存储过程。

重要

BizTalk Server 提供的“本机”SQL 适配器要求存储过程将 FOR XML 子句作为 SELECT 语句的一部分。 可以将此类存储过程与基于 WCF 的 SQL 适配器一起使用,而无需对存储过程定义进行任何更改。

始终可以使用与早期版本的 BizTalk Server 一起提供的“本机”SQL 适配器生成的架构。 有关详细信息,请参阅 将 FOR XML 查询与 WCF-SQL 适配器配合使用

如何使用 FOR XML 子句调用存储过程

在 SQL Server Management Studio 中使用 FOR XML 子句调用存储过程或使用 BizTalk Server 提供的 SQL 适配器时,输出采用 xml 消息的形式。 若要将这些过程用于基于 WCF 的 SQL 适配器,必须具有输出消息的架构。 基于 WCF 的 SQL 适配器在使用 FOR XML 子句执行存储过程后从 SQL Server 接收响应消息时需要此架构。 请注意,调用此存储过程的请求消息将由适配器本身生成。

除了具有响应消息的架构之外,还必须执行某些任务,以使用基于 WCF 的 SQL 适配器通过 FOR XML 子句调用存储过程。

  1. 使用 FOR XML 子句为存储过程生成响应消息的模式。 如果已有由 BizTalk Server 提供的“本机”SQL 适配器生成的响应架构,则可以跳过此步骤。

  2. 创建 BizTalk 项目,并将生成的架构添加到项目中。

  3. 使用基于 WCF 的 SQL 适配器通过 FOR XML 子句为存储过程生成架构。 这为适配器发送到 SQL Server 以调用存储过程的请求消息提供架构。

  4. 在 BizTalk 项目中创建消息,以便从 SQL Server 发送和接收消息。 请求消息必须符合适配器生成的请求消息的架构。 响应消息必须符合使用“本机”SQL 适配器获取的响应消息的架构,或者通过在 SQL Server Management Studio 中使用 FOR XML 子句执行存储过程。

  5. 创建编排以调用 SQL Server 数据库中的存储过程。

  6. 生成和部署 BizTalk 项目。

  7. 通过创建物理发送和接收端口来配置 BizTalk 应用程序。

  8. 启动 BizTalk 应用程序。

为存储过程的响应消息生成架构

注释

如果 SQL 适配器生成的响应架构可用于 BizTalk Server,则无需执行此步骤。

可以为存储过程的响应消息生成架构,前提是存储过程中的 SELECT 语句具有 xmlschema 子句和 for xml 子句。 在本主题中,我们使用GET_EMP_DETAILS_FOR_XML存储过程来检索给定员工 ID 的员工详细信息。 若要通过执行存储过程来检索架构,SELECT 语句如下所示:

SELECT [Employee_ID] ,[Name] ,[DOJ] ,[Designation] ,[Job_Description] ,[Photo] ,cast([Rating] as varchar(100)) as Rating ,[Salary] ,[Last_Modified] ,[Status] ,[Address]
FROM [Adapt_Doc].[dbo].[Employee] for xml auto, xmlschema

执行此存储过程以获取响应消息的架构。 请注意,存储过程的响应包含架构以及执行存储过程的数据。 必须从响应复制架构并将其保存到文本板。 对于此示例,可以将此架构命名为 ResponseSchema.xsd。 现在必须在 Visual Studio 中创建 BizTalk 项目,并将此架构添加到项目中。

重要

在执行存储过程生成架构后,请确保删除xmlschema子句。 如果您未能做到这一点,当您最终通过 BizTalk 执行存储过程时,将会在响应消息中再次生成模式。 因此,若要将响应消息作为 xml 获取,必须删除该 xmlschema 子句。

将架构添加到 BizTalk 项目

  1. 在 Visual Studio 中创建 BizTalk 项目。

  2. 将为存储过程生成的响应架构添加到 BizTalk 项目。 右键单击解决方案资源管理器中的 BizTalk 项目,指向 “添加”,然后单击“ 现有项”。 在“添加现有项”对话框中,导航到保存架构的位置,然后单击“ 添加”。

  3. 在 Visual Studio 中打开架构并进行以下更改。

    1. 将节点添加到架构,并将现有根节点移到此新添加的节点下。 为根节点命名。 对于本主题,请将根节点重命名为 Root

    2. 为存储过程生成的响应架构引用 sqltypes.xsd。 可以从https://go.microsoft.com/fwlink/?linkid=31850获取 sqltypes.xsd 架构。 将 sqltypes.xsd 架构添加到 BizTalk 项目。 有关此架构的详细信息,请转到:

    3. 在为存储过程生成的架构中,将值 import schemaLocation 更改为以下内容。

      import schemaLocation=”sqltypes.xsd”
      

      这样做是因为已将 sqltypes.xsd 架构添加到 BizTalk 项目。

    4. 为架构提供目标命名空间。 <单击“架构>”节点,然后在“属性”窗格中指定目标命名空间属性中的命名空间。 对于本主题,请为命名空间指定为 http://ForXmlStoredProcs/namespace.

为请求消息生成架构以调用存储过程

若要为请求消息生成架构,可以使用 Visual Studio 中的 BizTalk 项目中的“使用适配器服务外接程序”。 对于本主题,请为GET_EMP_DETAILS_FOR_XML存储过程生成架构。 有关如何使用 Consume Adapter Service 加载项生成架构的详细信息,请参阅 在 Visual Studio 中使用 SQL 适配器检索 SQL Server 操作的元数据

重要

必须仅从“使用适配器服务加载项”中的“过程”节点选择过程来生成架构。

定义消息和消息类型

前面生成的架构描述了业务流程中消息所需的“类型”。 消息通常是变量,类型由相应的架构定义。 现在必须为编排创建消息,并将其链接到在上一步中生成的架构。

  1. 将一项编排添加到 BizTalk 项目中。 在解决方案资源管理器中,右键单击 BizTalk 项目名称,指向 “添加”,然后单击“ 新建项”。 键入 BizTalk 业务流程的名称,然后单击“ 添加”。

  2. 打开 BizTalk 项目的“业务流程视图”窗口(如果尚未打开)。 为此,请单击“ 视图”,指向 “其他窗口”,然后单击“ 业务流程视图”。

  3. 在业务流程视图中,右键单击 “消息”,然后单击“ 新建消息”。

  4. 右键单击新创建的消息,然后选择“ 属性窗口”。

  5. Message_1“属性”窗格中,执行以下作:

    用这个 要执行的操作
    标识符 类型 Request
    消息类型 在下拉列表中,展开 架构,然后选择 ForXMLProcedure.Procedure_dbo.GET_EMP_DETAILS_FOR_XML,其中 ForXMLProcedure 是你的 BizTalk 项目的名称。 Procedure_dbo是用来调用GET_EMP_DETAILS_FOR_XML过程时生成的数据库架构。
  6. 重复步骤 2 以创建新消息。 在新消息的 “属性 ”窗格中,执行以下作:

    用这个 要执行的操作
    标识符 类型 Response
    消息类型 在下拉列表中,展开模式,然后选择ForXMLProcedure.ResponseSchema,其中 ResponseSchema 是执行存储过程生成的响应模式的名称,如为存储过程生成响应消息的模式中所述。

设置业务流程

必须创建 BizTalk 编排以使用 BizTalk Server 在 SQL Server 中执行存储过程。 在此业务流程中,会在定义的接收位置投递请求消息。 SQL 适配器使用此消息并将其传递到 SQL Server。 SQL Server 的响应将保存到另一个位置。 必须包含“发送和接收”形状,才能将消息分别发送到 SQL Server 和接收响应。 用于调用过程的示例编排如下所示:

调用存储过程的编排

添加消息形状

请确保为每个邮件形状指定以下属性。 “形状”列中列出的名称是消息形状的名称,如上述编排中所显示。

形状 形状类型 性能
接收消息 接收 - 将 名称 设置为 ReceiveMessage
- 将 “激活 ”设置为 True
发送消息 发送 - 将 名称 设置为 SendMessage
接收响应 接收 - 将 名称 设置为 ReceiveResponse
- 将 “激活 ”设置为 False
SendResponse 发送 - 将 名称 设置为 SendResponse

添加端口

请确保为每个逻辑端口指定以下属性。 端口列中列出的名称是在编排中显示的端口的名称。

港口 性能
MessageIn - 将 标识符 设置为 MessageIn
- 将 类型 设置为 MessageInType
- 将 通信模式 设置为 单向
- 将通信方向设置为接收
LOBPort - 将 标识符 设置为 LOBPort
- 将 类型 设置为 LOBPortType
- 将 通信模式 设置为 请求-响应
- 将 通信方向 设置为 发送接收
ResponseOut - 将 标识符 设置为 ResponseOut
- 将 类型 设置为 ResponseOutType
- 将 通信模式 设置为 单向
- 将通信方向设置为发送

指定动作形状的消息,并将其连接到端口

下表列出了为操作形状指定消息及将消息链接到端口时需要设置的属性及其值。 Shape 列中列出的名称是前文提到的业务编排中显示的消息形状的名称。

形状 性能
接收消息 - 将 消息 设置为 请求
- 将 操作 设置为 MessageIn.FOR_XML.Request
发送消息 - 将 消息 设置为 请求
- 将 操作 设置为 LOBPort.FOR_XML.Request
接收响应 - 将 消息 设置为 响应
- 将 操作 设置为 LOBPort.FOR_XML.Response
SendResponse - 将 消息 设置为 响应
- 将 操作 设置为 ResponseOut.FOR_XML.Request

指定这些属性后,消息形状符和端口被连接,您的编排已完成。

现在必须生成 BizTalk 解决方案并将其部署到 BizTalk Server。 有关详细信息,请参阅 生成和运行业务流程

配置 BizTalk 应用程序

部署 BizTalk 项目后,前面创建的业务流程将列在 BizTalk Server 管理控制台中的“业务流程”窗格下。 必须使用 BizTalk Server 管理控制台来配置应用程序。 有关演练,请参阅 演练:部署基本 BizTalk 应用程序

配置应用程序涉及:

  • 为应用程序选择主机。

  • 将业务流程中创建的端口映射到 BizTalk Server 管理控制台中的物理端口。 对于此编排,必须:

    • 请在硬盘上指定一个位置及其对应的文件端口,以便放置请求消息。 BizTalk 业务流程将使用请求消息并将其发送到 SQL Server 数据库。

    • 定义硬盘上的位置和相应的文件端口,BizTalk 业务流程将删除包含来自 SQL Server 数据库的响应的响应消息。

    • 定义物理 WCF-Custom 或 WCF-SQL 发送端口以将消息发送到 SQL Server 数据库。 有关如何创建发送端口的说明,请参阅 手动配置到 SQL 适配器的物理端口绑定

      还必须在发送端口中指定操作。 对于包含 FOR XML 子句的过程,必须按照以下格式设置操作。

      XmlProcedure/<schema_name>/<procedure_name>
      

      因此,对于我们要执行GET_EMP_DETAILS_FOR_XML过程的这个事项,所采取的行动将是:

      XmlProcedure/dbo/GET_EMP_DETAILS_FOR_XML
      

      有关设置动作的详细信息,请参阅 配置 SQL 适配器的 SOAP 动作

      在使用 FOR XML 子句执行存储过程时,还必须设置以下绑定属性。

      绑定属性名称 将此设置为
      XmlStoredProcedureRootNodeName 指定添加到为存储过程生成的响应架构的根节点的名称,如 存储过程的响应消息生成架构中所述。 对于本主题,请将此项设置为 Root
      Xml存储过程根节点命名空间 为存储过程生成的响应架构指定目标命名空间,如 存储过程的响应消息生成架构中所述。 对于本主题,请将此设置为 http://ForXmlStoredProcs/namespace.

      有关指定绑定属性的值的详细信息,请参阅 配置 SQL 适配器的绑定属性

      注释

      使用“消耗适配器服务”BizTalk 项目外接程序生成架构时,还会创建一个绑定文件,其中包含有关这些端口及其对应操作信息。 可以从 BizTalk Server 管理控制台导入此绑定文件,以创建发送端口(用于出站呼叫)或接收端口(对于入站呼叫)。 有关详细信息,请参阅 使用端口绑定文件配置物理端口绑定以使用 SQL 适配器

启动应用程序

必须启动 BizTalk 应用程序才能在 SQL Server 数据库中调用过程。 有关启动 BizTalk 应用程序的说明,请参阅 如何启动业务流程

在此阶段,请确保:

  • 用于接收业务流程请求消息的 FILE 接收端口正在运行。

  • 用于从业务流程接收响应消息的 FILE 发送端口正在运行。

  • WCF-Custom 和 WCF-SQL 发送端口用于将消息发送到 SQL Server 数据库,目前正在运行。

  • 正在运行该操作的 BizTalk 业务流程。

执行操作

运行应用程序后,必须将请求消息投递到 FILE 接收位置。 请求消息的架构必须符合使用 Consume Adapter Service 外接程序生成的请求方案的流程架构。 例如,调用GET_EMP_DETAILS_FOR XML 的请求消息为:

<GET_EMP_DETAILS_FOR_XML xmlns="http://schemas.microsoft.com/Sql/2008/05/Procedures/dbo">
  <emp_id>10765</emp_id>
</GET_EMP_DETAILS_FOR_XML>

有关使用 SQL 适配器在 SQL Server 数据库中调用过程的请求消息架构的详细信息,请参阅 过程和函数的消息 架构。

协调处理消息并将其发送到 SQL Server 数据库。 SQL Server 数据库的响应保存在定义为业务流程一部分的其他 FILE 位置。 例如,来自 SQL Server 数据库的上述请求消息的响应为:

<?xml version="1.0" encoding="utf-8"?>
<Root xmlns="http://ForXmlStoredProcs/namespace">
  <Adapt_Doc.dbo.Employee Employee_ID="10765" Name="John" Designation="asdfaf" Salary="3434.00" Last_Modified="AAAAAAAANso=" Status="0" xmlns="" />
</Root>

请注意,响应是按照执行存储过程生成的相同架构接收的。 另请注意,根节点和命名空间与分别指定为 XmlStoredProcedureRootNodeNameXmlStoredProcedureRootNodeNamespace 绑定属性的值相同。

最佳做法

部署并配置 BizTalk 项目后,可以将配置设置导出到名为绑定文件的 XML 文件。 生成绑定文件后,可以从文件导入配置设置,以便无需为同一业务流程创建发送端口和接收端口等项。 有关绑定文件的详细信息,请参阅 重复使用适配器绑定

另请参阅

使用 SQL 适配器开发 BizTalk 应用程序