DTS 概述

Microsoft® SQL Server™ 2000 数据转换服务 (DTS) 是一组图形工具和可编程对象，使您得以将取自完全不同源的数据析取、转换并合并到单个或多个目的。

下列各部分提供了有关 DTS 概念、工具和功能的基本信息。

主题 | 描述
DTS 基础 | 描述 DTS 的功用，并概述其所解决的业务问题。
DTS 工具 | 描述与 SQL Server 2000 一起提供的用于生成 DTS 包的图形工具。
DTS 包元素 | 描述包的主要组件，例如连接、DTS 任务和 DTS 转换。
管理 DTS 包 | 说明包管理的基础，包括创建、编辑、保存、删除和执行包。
将功能添加到 DTS 包 | 说明如何通过使用 Microsoft ActiveX® 脚本自定义包来生成复杂包。描述如何将包步骤联接到事务和使包数据表现给外部源。
共享元数据 | 描述如何使用有 DTS 的 SQL Server 2000 Meta Data Services 来跟踪数据集市或数据仓库中的包数据。
DTS 中的使用注意事项 | 描述在使用 DTS 时可能出现的特定数据变换和转换问题。

有关使用 DTS 对象模型编程的更多信息，请参见编制 DTS 应用程序。


DTS 基础

许多单位都需要将数据集中以改进企业决策制订。但是，他们的数据可能以各种格式保存并分布在不同的位置。数据转换服务 (DTS) 通过提供一组工具，使您得以将来自完全不同的源的数据析取、转换和合并到 DTS 连通性所支持的单个或多个目的，以满足这些重要的商业需求。通过使用 DTS 工具图形化地生成 DTS 包或使用 DTS 对象模型编制包，可创建适合您单位的特殊商业需要的自定义数据移动解决方案。

DTS 包

DTS 包是一个有组织的连接、DTS 任务、DTS 转换和工作流约束（该工作流约束使用 DTS 工具或编程装配并保存到 Microsoft® SQL Server™ 2000、SQL Server 2000 Meta Data Services，保存为结构化存储文件或 Microsoft Visual Basic® 文件）的集合。

当包运行时,每个包都包含一个或多个顺序或并行执行的步骤。执行后，包连接到正确的数据源、复制数据和数据库对象、转换数据，然后通知其他用户或事件进程。可以对包进行编辑、密码保护、调度执行和按版本检索。

有关更多信息，请参见创建 DTS 包。

DTS 任务

DTS 任务是一组离散的功能，在包中作为单个步骤执行。每个任务都定义了要执行的工作项作为数据移动和数据转换进程的一部分，或者作为一个要执行的作业。

DTS 提供了许多任务，它们是 DTS 对象模型的一部分，并且可以通过 DTS 设计器图形化或者通过编程方式访问。这些可以单独配置的任务范围广泛，包括数据复制、数据转换和通知状况。例如：

  • 导入和导出数据。

    DTS 能从文本文件或 OLE DB 数据源（例如，Microsoft Access 2000 数据库）将数据导入到 SQL Server 中。或者，也可以从 SQL Server 将数据导出到 OLE DB 数据目的（例如一个 Microsoft Excel 2000 电子表格）。DTS 还允许将数据从文本文件高速装载到 SQL Server 表。

  • 转换数据。

    DTS 设计器包含一个转换数据任务，使您得以从数据源连接中选择数据，将数据列映射到一组转换，以及将转换的数据发送到目的连接。DTS 设计器还包括一个数据驱动的查询任务,使您得以将数据映射到参数化查询。

  • 复制数据库对象。

    使用 DTS，除了传输数据之外，还可以传输索引、视图、登录、存储过程、触发器、规则、默认值、约束，以及用户定义数据类型。另外，还可以生成脚本以复制数据库对象。

    说明 对这个性能有一些限制。有关更多信息，请参见复制 SQL Server 对象任务。

  • 将消息发送到其他用户和包以及从其他用户和包接收消息。

    DTS 包含一个发送邮件任务，使您得以在包步骤成功或失败时发送一个电子邮件。DTS 还包含一个执行包任务，使得一个包运行另一个作为包步骤，另外还包含一个消息队列任务，使您得以使用消息队列发送和接收包之间的消息。

  • 对数据源执行一组 Transact-SQL 语句或 Microsoft ActiveX® 脚本。

    执行 SQL 和 ActiveX 脚本任务使您得以编写自己的 SQL 语句和脚本代码，并作为包中的一个步骤执行它们。

因为 DTS 基于一个可扩展的 COM 模型，所以您可以创建自己的自定义任务。可以将自定义任务集成到 DTS 设计器的用户界面，并将它们保存为 DTS 对象模型的一部分。

有关更多信息，请参见 DTS 任务。

DTS 转换

DTS 转换是在数据到达目的之前应用于一块数据的一个或多个函数或操作。源数据未改变。例如，可以从源数据的一列中析取一个子串并将其复制到目的表。这个特定的子串函数是映射到源列的转换。也可以使用某些特性（例如，列中的特定数据值）搜索行并只对那些行中的数据应用函数。转换使得在导入和导出进程期间执行复杂的数据验证、数据清理和变换更加容易。对于列数据，可以：

  • 操纵列数据。

    例如，可以更改列的类型、大小、小数位数、精度或为空性。

  • 应用作为 ActiveX 脚本编写的函数。

    这些函数可以应用到专门的转换或者包含条件逻辑。例如，可以用一种脚本语言编写一个函数以检查列中数值超过 1000 的数据。当找到这样一个数值时，就在目的表中用值 -1 替换。对于列数值在 1000 以下的行，只是简单地将该值复制到目的表。

  • 从与 DTS 一起提供的若干转换中选择。

    例如，用字符串和数据格式重新格式化输入数据的函数、不同字符串转换函数以及把从源列到目的列所指定的文件内容进行复制的函数。

  • 将您自己的转换写为 COM 对象并将那些转换应用到列数据。

有关更多信息，请参见 DTS 转换。

DTS 包工作流

可以使用下面的方法定义在包中执行步骤的顺序：

  • 优先约束使您得以根据是否执行第一个任务、执行成功或执行不成功来链接两个任务。可以使用优先约束在工作流中生成条件分支。没有约束的步骤将立即执行，并且可以并行执行几个步骤。

  • 修改工作流的 ActiveX 脚本。有关更多信息，请参见在 DTS 中使用 ActiveX 脚本。

有关更多信息，请参见 DTS 包工作流。

连通性

DTS 基于 OLE DB 结构，该结构使您得以从不同的数据源复制和转换数据。例如：

  • 直接从 SQL Server 和 Oracle，使用本机 OLE DB 提供程序。

  • 从 ODBC 源，使用 ODBC 的 Microsoft OLE DB 提供程序。

  • 从 Access 2000、Excel 2000、Microsoft Visual FoxPro®、dBase、Paradox、HTML 和其它文件数据源。

  • 从文本文件，使用内置 DTS 平面文件 OLE DB 提供程序。

  • 从 Microsoft Exchange Server、Microsoft Active Directory™ 和其它非关系型数据源。

  • 从第三方供应商提供的其它数据源。

DTS 功能可能受限于特定数据库、ODBC 驱动程序或 OLE DB 提供程序的性能。有关更多信息，请参见数据变换和转换注意事项。

有关更多信息，请参见 DTS 连接。

DTS 工具

DTS 包括一些简化包创建、执行和管理的工具：

  • DTS 导入/导出向导，用于生成包以导入、导出和转换数据或复制数据库对象。

  • DTS 设计器，一个图形化应用程序，使您得以构造包含复杂工作流、到异类数据源的多个连接和事件驱动逻辑的包。

  • 在 SQL Server 企业管理器控制台树中的"数据转换服务"节点用于查看、创建、装载和执行 DTS 包、控制 DTS 设计器设置以及管理执行日志。

  • 包执行实用工具：
    • dtswiz 实用工具通过使用命令提示选项启动 DTS 导入/导出向导。

    • dtsrun 实用工具从命令提示运行包。

    • DTS 运行实用工具 (dtsrunui) 使您得以使用对话框运行包。
  • DTS 查询设计器，一个可视数据库工具，它使得在 DTS 设计器中生成查询更加容易。

有关更多信息，请参见 DTS 工具。

元数据

DTS 包含将包元数据和数据沿袭信息保存到 Meta Data Services 并将信息的那些类型链接的功能。可以为在包中引用的数据库存储目录元数据，以及为数据集市或数据仓库存储有关数据特定行的历史记录的计帐信息。

有关更多信息，请参见共享元数据。

请参见

编制 DTS 应用程序


DTS 工具

数据转换服务 (DTS) 包含以下一套用于创建、调度和执行 DTS 包的工具。

工具 | 描述
DTS 导入/导出向导 | 此向导用于将数据复制到 Microsoft® SQL Server™ 实例和从此类实例中复制数据，以及将转换映射到数据。
DTS 设计器 | 此图形工具用于生成带有工作流和事件驱动逻辑的复杂包。也可以使用 DTS 设计器编辑和自定义用 DTS 导入/导出向导创建的包。
DTS 和 SQL Server 企业管理器 | 这些选项可用于从 SQL Server 企业管理器中操作包和访问包信息。
DTS 包执行实用工具 包括以下实用工具：
  • DTS 运行实用工具，这是一组用于调度和运行包的对话框。

  • dtsrun 实用工具，这是用于运行包的命令提示实用工具。有关更多信息，请参见 dtsrun 实用工具。
DTS 查询设计器 | 此图形工具用于在 DTS 中生成查询。


DTS 导入/导出向导

在所有的数据转换服务 (DTS) 工具中，DTS 导入/导出向导为在 OLE DB 数据源之间复制数据提供了最简单的方法。

在连接到源和目的之后，可以选择要导入或导出的数据，并可对要复制的数据应用各种转换（例如，通过选择列或使用 Microsoft® ActiveX® 脚本）。在大多数情况下，可以自动与源数据一起复制主键和外键约束。

说明 可以复制从 SQL 查询中获得的数据。SQL 查询可以包含来自同一数据库或分布式查询中的多个表的联接。作为整个进程的一部分，如果不存在任何表，则 DTS 导入/导出向导会自动为您创建目的表。

可用的数据源

使用 DTS 导入/导出向导，可以连接到下列数据源：

  • 大多数的 OLE DB 和 ODBC 数据源以及用户指定的 OLE DB 数据源。

  • 文本文件。

  • 到一个或多个 Microsoft SQL Server™ 实例的其它连接。

  • Oracle 和 Informix 数据库。

    必须已经安装 Oracle 或 Informix 客户端软件。

  • Microsoft Excel 电子表格。

  • Microsoft Access 和 Microsoft FoxPro® 数据库。

  • dBase 或 Paradox 数据库。

有关更多信息，请参见 DTS 连接。

转换数据

除复制数据外，还可以用诸如 Microsoft Visual Basic® Scripting Edition (VBScript) 或 Microsoft JScript® 之类的 ActiveX 脚本语言转换列级数据。有关更多信息，请参见 DTS 转换、转换数据任务和在 DTS 中使用 ActiveX 脚本。

复制数据库对象

使用 DTS 导入/导出向导，可以转换索引、视图、角色、存储过程和引用完整性约束等数据库对象。有关更多信息，请参见复制 SQL Server 对象任务。

保存 DTS 包

完成 DTS 导入/导出向导之后，可以将连接、转换以及调度信息保存为 DTS 包。可以下列形式保存包：

  • 保存到 SQL Server msdb 数据库。

  • 保存到 SQL Server 2000 Meta Data Services。

  • 保存存为结构化存储文件（.dts 文件）。

  • 保存为 Visual Basic 文件。

可以立即运行包或调度该包以供今后执行。

有关更多信息，请参见保存 DTS 包和调度 DTS 包的执行。

编辑包

如果使用 DTS 导入/导出向导创建了一个包，然后保存了该包，则可以在 DTS 设计器中编辑这个包。使用 DTS 设计器，可以自定义在 DTS 导入/导出向导中创建的基本包，添加步骤、任务、转换、事件驱动逻辑以及配置工作流。有关更多信息，请参见 DTS 设计器。

请参见

dtswiz 实用工具


使用 DTS 导入/导出向导创建 DTS 包

数据转换服务 (DTS) 导入/导出向导提供生成 DTS 包的最简单方法，可以交互式地指导您完成整个复制和转换数据的过程。下面是使用 DTS 导入/导出向导创建包的基本步骤：

  1. 指定是要导入数据还是导出数据。

    需要指定是从 Microsoft® SQL Server™ 的实例中将数据导出到另一个数据源（例如，SQL Server 2000 的另一个实例），还是将数据从另一个数据源导入到 SQL Server 实例中。在 SQL Server 企业管理器中，通过控制台树的"数据转换服务"节点可以使用这两个选项，还可以通过 dtswiz 命令提示实用工具以命令开关的形式使用这两个选项。

    如果从"开始"菜单或命令提示访问 DTS 导入/导出向导，则不需要指定是导入数据还是导出数据。

  2. 选择数据源和数据目的。

    可以从 OLE DB 数据源列表中选择，该列表中包含用于数据库和非数据库源（例如，文本文件）的提供程序。还必须指定任何要求的登录、安全性或文件位置信息。如果正在从文本文件导入数据，则必须指定文本文件的格式和分隔符。

    导入数据时，活动服务器连接被指定为默认的目的服务器。当导出数据时，活动服务器连接被指定为默认的源服务器。

  3. 选择是复制表或视图、复制查询结果，还是传输对象和数据。
    • 如果选择复制数据，需要决定要复制的列或视图并决定是否要转换数据。如果源数据是视图，则 DTS 导入/导出向导自动将该视图转换为目的中的表。

    • 如果选择查询源数据并复制结果，则需要构造 SQL 查询，该查询可以是异类查询，也可以是分布式查询。可以手动输入 SQL 查询，也可以图形方式输入查询。在完成查询之后，可以决定是否将转换添加到查询结果中。有关以图形方式输入 SQL 查询的更多信息，请参见 DTS 查询设计器。

    • 如果选择在 SQL Server 实例之间传输数据库对象，需要：选择要传输的对象（如视图、存储过程、索引及规则）；选择是否要首先除去现有的数据库对象；替换或追加现有的数据；包括相关对象。

      有关更多信息，请参见复制 SQL Server 对象任务。

  4. 选择列、添加转换或复制约束（可选）。

    如果复制数据或查询的结果，可以自定义要复制到目的的数据。可以：

    • 选择要复制的源或目的列。

    • 选择要忽略的源或目的列。

    • 更改数据类型（如果有效）。

    • 定义如何在源和目的之间转换数据。

    • 使用 Microsoft ActiveX® 脚本将转换映射到列或行数据上。
  5. 保存、运行或调度包。

    创建包之后，需要决定：

    • 用来保存 DTS 包的格式。

      可以按结构化存储文件（.dts 文件）或 Microsoft Microsoft Visual Basic® 文件的形式，将包保存到 SQL Server msdb 数据库或 Microsoft SQL Server 2000 Meta Data Services。

    • 要在何时运行该包。

      可以在完成 DTS 导入/导出向导之后运行包，或者使用 SQL Server 代理调度包定期执行。

      可以使用创建发布向导发布数据。有关更多信息，请参见复制向导。

      重要 在创建或执行向导的过程中，不要打开正在作为源或目的使用的 Microsoft Excel 文件，因为这会导致"文件正在使用"的错误。

使用 DTS 导入/导出向导创建 DTS 包

向导

向导

从 DTS 导入/导出向导中执行 DTS 包

向导

向导

请参见

管理 DTS 包


DTS 设计器

数据转换服务 (DTS) 设计器是一种工具，用于在一个或多个数据库与 Microsoft® SQL Server™ 实例之间导入、导出和转换异类数据。DTS 设计器通过图形方式实现 DTS 对象模型，使您得以创建具有广泛功能的 DTS 包。可以使用 DTS 设计器来：

  • 创建一个简单的包（例如，在各数据库之间复制数据的包）。

  • 创建一个包含复杂工作流的包（例如，包含分支、多个步骤、多个连接、复杂的逻辑以及事件驱动代码的包）。

  • 编辑现有的包（例如，使用 DTS 导入/导出向导创建的包）。
访问 DTS 设计器

通过 SQL Server 企业管理器控制台树的"数据转换服务"节点可以访问 DTS 设计器。

DTS 设计器用户界面

通过 DTS 设计器图形用户界面，可以使用拖放方法以及完成组成包的各种 DTS 对象的属性页生成和配置包。用户界面包括：

  • DTS 设计器主面板，由以下部分构成：
    • 设计表，在上面通过拖动代表 DTS 任务、DTS 转换和优先约束的图形对象创建工作流。

    • 菜单栏，包含用于包操作、编辑操作、数据源、任务和工作流项目的选择。

    • 工具栏，包含的按钮用于：创建、保存和执行包；打印工作流；剪切、复制和粘贴工作流中的图形对象；批注工作流；以及更改设计表上的工作流布局和工作流大小。

    • "连接"工具栏，包含用于数据源的连接。

    • 包含 DTS 任务的"任务"工具栏。

      可以使用"连接"工具栏和"任务"工具栏的快捷菜单靠接和取消靠接这两个工具栏。

  • 快捷菜单，用来配置和编辑包组件和工作流（例如连接、任务和工作流对象）。


使用 DTS 设计器创建包

下例显示如何生成、配置、执行和保存数据转换服务 (DTS) 包。

使用 DTS 设计器创建 DTS 包

企业管理器

企业管理器

配置和执行 DTS 包

  1. 选择源。

将对象从"连接"工具栏拖动到 DTS 设计器设计表中，然后在"连接属性"对话框中配置数据源。

  2. 选择目的。

将对象从"连接"工具栏拖动到设计表中，然后在"连接属性"对话框中配置数据源。

  3. 在源和目的之间有一个连线。

单击该数据源的图标，按住 CTRL 键，然后单击目的图标。右击目的图标，然后单击"转换数据任务"命令。此时，会出现一条线,显示数据流从源流向目的。

  4. 指定要移动的数据以及希望使用的转换方法。

双击源与目的之间的连线。在"转换数据任务属性"对话框中的"源"选项卡上，可以选择源表或使用 DTS 查询设计器生成查询。在"目的"选项卡上，可以选择现有的表或创建新表。在"转换"选项卡上，可以复制或转换数据。

有关更多信息，请参见 DTS 查询设计器。

  5. 将包保存到 SQL Server 2000 Meta Data Services、SQL Server、结构化存储文件或 Microsoft Visual Basic® 文件。

如果将包保存到 Meta Data Services，则可以使用数据沿袭功能按行确定数据的源位置。

  6. 执行该包。

在工具栏中单击"执行"按钮。

请参见

DTS 设计器示例：已完成的 DTS 包


DTS 设计器示例：已完成的 DTS 包

以下图表显示了 DTS 设计器的设计表上一个完整的数据转换服务 (DTS) 包。设计表上的图形对象表示连接、任务和优先约束。

以下是对这些图形对象的描述：

  • 一个与包含源数据的文本文件（"文本文件（源）"图标）的连接，和一个与目的 Northwind 数据库（Northwind 图标）的连接。

  • 一个转换数据任务（灰色箭头），定义要复制和转换的数据。

  • 两个优先约束（条带箭头），进一步指定工作流：
    • 如果该包运行并且将数据成功地从文本文件复制到 Microsoft® SQL Server™ 实例，则对数据复制到的表创建索引（带条纹的箭头从 Northwind 图标指向"创建索引"图标）。

    • 如果该包运行但是数据复制失败，则会向数据库管理员发一封电子邮件（带条纹的箭头从 Northwind 数据图标指向"发送邮件"任务图标）。
  • 文本批注（标志"客户更新，芝加哥"）。


DTS 设计器示例：复制 Northwind 数据

下例说明如何使用数据转换服务 (DTS) 设计器将 Northwind 数据库表从源复制到目的。基本的步骤如下：

  1. 建立两个连接，一个与源连接，另一个与目的连接。

  2. 添加转换数据任务，定义源表和目的表以及要执行的复制操作。

  3. 添加执行 SQL 任务，在复制数据之前检查目的表是否存在。如果并不存在该表，那么就创建它。如果存在该表，那么将其除去然后重新创建它。

  4. 配置工作流，以便 DTS 包步骤以正确的顺序执行。

  5. 运行包。

  6. 保存包以供反复使用。
连接到源

首先，创建与本地服务器上的 Northwind 数据库的连接。

在 DTS 设计器中创建到 Northwind 的连接

企业管理器

企业管理器

连接到目的

通常，源数据库和目的数据库不同，但是对于本例，您将创建第二个与 Northwind 数据库的连接。

使用 DTS 设计器再创建一个到 Northwind 数据库的连接

企业管理器

企业管理器

复制 Northwind 分类表

在 DTS 设计器中，通常使用转换数据任务将数据从源移动到目的，并将转换映射到数据上。不过，在这个简单的示例中，是将数据从 Northwind 表复制到另一个表。

使用 DTS 设计器从 Northwind 表复制数据

企业管理器

企业管理器

除去并重新创建 Northwind 分类表

通常，您需要反复使用包。在创建目的表并使用新数据填充该表时（如本例中所示），您需要包括一个步骤，在该步骤中，包在填充目的表之前先除去并重新创建该表。

完成这一任务最简单的方法是：

  • 向包中添加执行 SQL 任务，包括除去并重新创建目的表所需的 SQL 语句。

  • 使用优先约束将完成的执行 SQL 任务正确地放在工作中。

配置执行 SQL 任务除去并重新创建目的表

企业管理器

企业管理器

配置工作流

接下来，您需要使用优先约束将完成的执行 SQL 任务正确地放在工作流中。在该包中，执行 SQL 任务是第一个工作流步骤。

在执行 SQL 任务中配置工作流

企业管理器

企业管理器

执行包

您已创建了由两个步骤组成的包（执行 SQL 任务和转换数据任务）。现在运行该包将会：

  1. 建立与本地服务器中的 Northwind 数据库的两个连接。

  2. 检查目的表是否存在。如果目的表不存在，则会创建一个。如果目的表存在，则会除去该目的表并重新创建。

  3. 将数据从 Northwind 数据库中的一个表复制到另一个表。

执行包

  • 在工具栏上单击"执行"按钮。

    出现"执行 DTS 包"对话框，为两个步骤提供步骤信息和状态信息。然后出现"包执行结果"对话框。

    如果没有成功执行包，则单击"执行 DTS 包"对话框中失败的步骤以获得错误信息，然后检查所创建对象的属性，以确保输入的信息正确。

保存包

最后，您需要在退出 DTS 设计器之前保存包，以供反复使用。可以从几个保存选项中选择。

将 DTS 包保存到 SQL Server msdb 表

企业管理器

企业管理器

总结

本例说明如何在 DTS 设计器中建立和运行一个简单的包。既然已经熟悉了 DTS 的基础知识，就可以向工作流添加 DTS 转换、DTS 任务以及优先约束。有关更多信息，请参见 DTS 包元素。


DTS 包模板

数据转换服务 (DTS) 包模板是根据典型的使用环境建立的部分配置的包。每个模板都包含针对特定任务或任务集生成的任务和工作流项目（例如，在 Microsoft® SQL Server™ 2000 实例之间复制数据）。复制和完成这些模板以便简单快速地配置任务、连接和工作流。

配置完模板后，在新位置上以数据包形式保存一个复本。然后，可以重新使用模板、自定义复本和以任何 DTS 格式保存信息。由于 DTS 模板是只读文件（扩展名为 .dtt），您不会意外地重写模板。

默认情况下，包模板保存在 \\Tools\Templates\DTS 文件夹内。但是，可以从任何位置保存和使用包模板。

创建模板

若要创建包模板，请生成一个包并使用"脱接编辑"彻底删除需要模板用户配置的属性。例如，可以用"脱接编辑"将"在此输入登录名"这样的文本指派为用户名的属性，而不必在"连接属性"对话框内输入特定的用户名。也可以在包模板中添加指令和标签。生成包模板后，将其保存为以 .dtt 为扩展名的结构化存储文件。

创建和保存包模板

企业管理器

企业管理器

访问包模板

企业管理器


DTS 和 SQL Server 企业管理器

SQL Server 企业管理器控制台树的数据转换服务 (DTS) 节点提供了便捷的方式来访问 DTS 工具、处理 DTS 包以及访问包信息。可以使用这些功能：

  • 用 DTS 导入/导出向导或 DTS 设计器打开一个新包。在 DTS 设计器中，可以选择和编辑现有的包。该包可能储存到 SQL Server、SQL Server 2000 Meta Data Services 或结构化存储文件。

    有关更多信息，请参见创建 DTS 包和编辑 DTS 包。

  • 连接到数据源及从该数据源导入元数据，并在 SQL Server 企业管理器的"元数据"节点内显示这些元数据。

    有关更多信息，请参见在 DTS 中查看元数据。

  • 在 DTS 设计器中打开包模板。

    有关更多信息，请参见 DTS 包模板。

  • 显示包的版本历史记录，在 DTS 设计器中编辑某特定包的版本，删除包版本。

    有关更多信息，请参见将 DTS 包保存到 Meta Data Services。

  • 显示和处理日志信息。

    有关更多信息，请参见使用 DTS 包日志。

  • 通过右击"数据转换服务"节点然后单击"属性"命令设置 DTS 设计器的属性。

  • 执行包。

    有关更多信息，请参见执行 DTS 包。

  • 调度包。

    有关更多信息，请参见调度 DTS 包的运行。


DTS 包执行实用工具

数据转换服务 (DTS) 包可以由 Microsoft® SQL Server™ 2000 中的两个包执行工具的任何一个来运行，这两个实用工具为：DTS 运行实用工具和 dtsrun 命令提示实用工具。通过使用这些工具，无须打开包就可以运行它。

DTS 运行实用工具使您得以创建命令提示及运行包或从 Microsoft 管理控制台 (MMC) 以外调度包。使用 dtsrun，可以从命令提示或批处理文件运行包。

DTS 运行实用工具

使用 DTS 运行实用工具，可以利用从命令提示调用的一组对话框执行现有的包。

使用 DTS 运行实用工具，可以设置：

  • 连接设置。

    指定服务器名称或文件名，确认包的保存方式及提供登录信息。

  • 调度选项。

    通过 SQL Server 代理指定包的定期执行。

  • 日志记录选项。

    可以标识并启用事件日志。

  • 全局变量设置。

    可以增加新的全局变量或更改现有的全局变量的属性。对包全局变量的修改仅在 DTS 运行实用工具会话期间有效。当会话关闭时，不保存对包的全局变量的修改。

  • 加密选项。

    可以对 DTS 运行实用工具要执行的命令提示选项进行加密。这使您得以为日后的使用创建加密的 dtsrun 命令。

也可以使用 DTS 运行实用工具生成 dtsrun 命令提示文本，使用或不使用加密参数。可以保存这些文本，将这些文本复制到一个文件，以后从命令提示处执行同样的操作时可以再次使用它。

通过从命令提示处执行不带任何命令开关的 dtsrunui，可以访问 DTS 运行实用工具。

使用 DTS 运行实用工具执行 DTS 包

企业管理器

企业管理器

dtsrun 命令提示实用工具

使用 dtsrun 命令提示实用工具，可以从命令提示处执行现有的包。可以从命令提示处执行带任意命令开关的 dtsrun 来访问此实用工具。

使用 dtsrun 执行 DTS 包

命令提示符

< 命令提示符

有关更多信息，请参见 dtsrun 实用工具。

请参见

执行 DTS 包

调度 DTS 包的执行


DTS 查询设计器

数据转换服务 (DTS) 查询设计器使用图形用户界面创建 SQL 查询。使用 DTS 查询设计器可以：

  • 以直观方式工作或使用 SQL 命令。

    DTS 查询设计器包括图形窗格和文本窗格。图形窗格直观显示查询，而文本窗格显示查询的 SQL 文本。可以在图形或文本两个窗格中的任何一个内工作。DTS 查询设计器使视图同步，以便它们始终处于当前状态。

  • 连接相关表。

    如果将一个以上的表添加到查询中，DTS 查询设计器将自动确定这些表之间的关系，并构造适当的连接命令。

  • 查询或更新数据库。

    可以用 DTS 查询设计器返回使用 Transact-SQL SELECT 语句的数据。还可用该设计器创建用于更新、添加或删除数据库记录的查询。

  • 即时查看和编辑结果。

    可以执行查询并在一个网格内处理记录集。这使您得以在数据库记录中间滚动和进行编辑。

请参见

数据转换服务查询设计器

关系图窗格

网格窗格

在查询设计器中浏览

结果窗格

SQL 窗格


DTS 包元素

本节介绍数据转换服务 (DTS) 包的主要元素。

主题 | 描述
DTS 任务 | 介绍 DTS 任务及其典型用法。
DTS 转换 | 介绍可以通过转换数据的 DTS 任务来使用的列级转换。
DTS 连接 | 介绍在 DTS 包中提供的不同类型的连接。
DTS 包工作流 | 介绍 DTS 包中的工作流顺序和包的执行步骤。


DTS 任务

在数据转换服务 (DTS) 包中通常包含一个或多个 DTS 任务。每个任务定义在数据移动和数据转换过程中需要执行的一项工作。

Microsoft® SQL Server™ 2000 提供了几个 DTS 任务，它们是 DTS 对象模型的一部分。通过 DTS 设计器可以访问这些任务（但"并行数据抽取"任务除外，它只能以程序方式访问）。这些任务可以用来：

  • 转换数据。例如，转换数据任务可用来复制数据，将多种转换映射到数据，并通过 Microsoft ActiveX® 脚本自定义这些转换。

    有关更多信息，请参见数据驱动的查询任务、转换数据任务和 ParallelDataPump 任务对象。

  • 复制和管理数据。例如，可以除去表、重新创建和重新填充表以及对表执行一系列查询。此外，还可以生成一个脱接的 Microsoft ActiveX 数据对象 (ADO) 记录集，然后从包中的其它步骤操作和访问该记录集。

    有关更多信息，请参见复制 SQL Server 对象任务、执行 SQL 任务、大容量插入任务和传输数据库对象任务。

  • 将任务当作包中的作业来运行。例如，可以使用"执行进程"任务来运行自定义的 Microsoft Visual Basic® 应用程序，以便在每天收集和统计数据。然后，可以使用"执行包"任务来运行第二个包，以导入和转换 Visual Basic 应用程序所生成的数据。当某个包步骤成功或失败时，还可以使用"发送邮件"任务向系统管理员发送电子邮件。

    有关更多信息，请参见 ActiveX 脚本任务、动态属性任务、执行包任务、文件传输协议任务、执行进程任务和发送邮件任务。

此外，还可以用支持 COM 的编程语言（如 Visual Basic）来自行生成自定义任务。如果要在 DTS 设计器中访问自定义任务，可以为该自定义任务创建用户界面（包括它自己的图标）。有关更多信息，请参见 DTS 自定义任务。

添加和配置任务

一个 DTS 包可以包含一个任务（如 ActiveX 脚本任务，在包运行时显示一个消息框）。但是，一个包通常包含多个任务、连接和工作流约束，并且，各项任务都设置为在有序的包工作流环境下运行。一个包中可以包括多个相同类型的任务（如六个执行 SQL 任务），而对每个任务进行不同的配置。

可以将任务添加到一个包中，然后按以下方式设置它们的属性：

  • 图形方式，即使用 DTS 设计器。

  • 程序方式，即使用 DTS 对象模型通过 Visual Basic 或 Microsoft Visual C++® 语言来生成包。有关更多信息，请参见设计 DTS 应用程序。

将 DTS 任务添加到 DTS 包

企业管理器


转换数据的任务

在数据转换服务 (DTS) 中，转换数据的任务基于一个名为 DTS 数据抽取的构架组件。

下列 DTS 任务用于实现 DTS 数据抽取。

任务 | 描述
转换数据任务 | 用于在多种遵从 OLE-DB 的数据源之间进行数据的点对点复制和转换。
数据驱动的查询任务 | 用于对数据执行基于 Transact-SQL 的灵活操作，包括存储过程和 INSERT、UPDATE 或 DELETE 语句。
ParallelDataPump 任务对象 | 用于复制和转换包含 OLE DB 层次行集的数据。该任务只能通过 DTS 对象模型以程序方式访问。

DTS 数据抽取作为一个 OLE DB 服务提供程序，也是提供一组数据移动接口的 COM 对象。

数据抽取结构支持：

  • 快速地批量复制经过转换的或未经转换的数据。

  • 使用脚本代码来定义转换。

  • 提供多种转换来转换字符串数据。

  • 自定义转换，以 Microsoft® Visual C++® 编写并编译为 COM 对象，可以通过程序方式或通过 DTS 设计器用户界面进行访问。

DTS 数据抽取还允许用户添加程序或 Microsoft ActiveX® 脚本函数，以访问数据抽取操作的特定阶段。例如，用户可以添加一个函数，指示数据抽取在复制和转换源数据之前将标题信息写入到一个文件。有关更多信息，请参见多阶段数据抽取功能。

配置转换数据的任务

要配置转换数据的任务，请执行以下步骤：

  1. 建立一个连接。至少需要连接到源和目的数据源。

    在 DTS 设计器中配置这些任务之前，必须创建两个到数据源的活动连接。如果在 ActiveX 脚本转换中定义其它连接，这些连接会在包运行时间建立。

    有关更多信息，请参见 DTS 连接和配置简单的查找查询。

  2. 对从源连接复制的数据执行任何所需数据类型的转换和变换。

    如果打算转换数据，就需要映射列级转换。可以使用下面的 DTS 工具：

    • DTS 导入/导出向导。默认情况下，该向导会创建一个或多个转换任务（这取决于选择要复制的源表的数量）。要在向导中转换列数据或行数据，必须用 ActiveX 脚本代码编写转换脚本。要编辑转换脚本，必须在 DTS 设计器中打开包，打开任务的属性对话框，然后编辑脚本。

      有关更多信息，请参见在 DTS 中使用 ActiveX 脚本。

    • DTS 设计器。您能够以图形方式将源列映射到目的列，选择转换类型，然后将转换类型应用到映射。或者，可以使用选择框来映射转换。

      说明 多数情况下，只需要用转换数据任务来映射列。对于普通用户，建议不要更改数据驱动的查询任务的默认列映射。有关更多信息，请参见生成数据驱动的查询。

检测行级错误

转换数据的任务使用异常错误文件记录有关错误行的信息。异常错误文件可包含：

  • 包信息，如包名称、说明和版本。

  • 步骤执行信息，其中包括与数据抽取操作相关的包步骤的名称以及步骤执行时间。

  • 错误信息，包括错误源（例如数据抽取或连接）和对错误的描述（例如，EmployeeData 列、第 2007 行出现的插入错误）。

转换数据的任务能在将行提交到数据库之前检测行级错误。例如，假设输入行包含丢失的或格式不正确的数据。当这些任务遇到这样的行时，将使该行失败且不将其传递到目的行。该错误在最大错误计数中计为一个错误。

对于某些错误（如重复的键或违反引用完整性），这些任务不能在行级上将它们检测出来。这些行失败只发生在传递到目的行之后。异常错误文件将记录下此错误，但不记录实际发生错误的行。因此，异常错误文件并不总是提供完整的错误信息。

如果为某一转换数据的任务配置了异常错误日志，每当运行包时，步骤执行信息就会追加到所指定的异常错误文件。如果所指定的异常错误文件当前并不存在，将在包执行时创建该文件。如果与该任务相关的步骤没有运行，不会生成异常错误文件数据。

也可以使用 Microsoft SQL Server™ 2000 异常错误文件选项创建其它日志文件，捕获执行转换数据任务时失败的源行和目的行。这些文件可用来检查失败的行并帮助解决数据方面的问题。源行和目的行的日志文件名与异常错误文件名相同，但它们所带的扩展名分别为 .Source 和 .Destination。只有当转换任务的执行过程中出现源行错误或目的行错误时，才会创建这些文件。

配置数据抽取异常错误文件

企业管理器

企业管理器

请参见

DTS 转换


转换数据任务

转换数据任务用于在源和目的之间复制数据，并将列级转换选择性地应用于数据。转换数据任务是数据转换服务 (DTS) 中数据抽取引擎的最基本实现。

转换数据任务最适用于在商务数据库、电子表格和文本文件之间对列级数据执行基于插入的复制和转换操作。该任务可用来在可支持的任何 OLE DB 连接之间复制和转换数据。由于该任务可以处理多种多样的数据源和数据转换，在创建程序包以合并来自不同源的数据时，将会频繁地使用它的一个或多个实例。

说明 如需将大量文本文件插入 Microsoft® SQL Server™ 并有较高的性能要求，可使用大容量插入任务。但大容量插入任务无法用来转换数据。有关更多信息，请参见大容量插入任务。

分批处理数据

如果转换数据任务的目的连接是用于 SQL Server 的 Microsoft OLE DB 提供程序，则可以使用快速装载选项，该选项可通过 OLE DB IRowsetFastLoad 接口使用。快速装载选项支持高性能、大批量的复制处理。启用快速装载选项之后，数据抽取就能接受分批的转换数据。

分批处理数据时，数据抽取将转换的行写入目的缓冲区，但不将它们提交到 SQL Server，除非达到指定的批处理大小或到达源数据末端。

您可以编写自己的函数来自定义转换数据任务中的批处理。有关更多信息，请参见多阶段数据抽取功能。

数据驱动的查询任务不能使用快速装载功能。

重要 此外，当在带有查找连接的转换数据任务中使用快速装载选项时，应确保查找连接与源或目的连接不同。

将转换应用于批处理

转换应用先于大容量复制进程。因此，可以在列级转换中使用快速装载选项，同样也可以不用该选项（例如 Microsoft® ActiveX® 脚本转换）。

处理错误和批数据

如果某行包含错误而转换数据任务没有检测出该错误，则此行将导致整批数据在提交时失败。这批数据中的有效行既不插入也不作为错误记入数据抽取异常错误文件。整批数据的失败在最大错误计数中只计为一个错误。

可以控制一批数据的大小和错误发生时提交数据的方式。设置一批数据的大小之前，应考虑以下事项：

  • 批量处理中出现的错误描述将记录在日志文件中，但是到批量处理回滚时错误行可能已经不可用了。因此，错误行可能不记入日志文件。

  • 默认情况下，设置一批数据的大小为 0，即从源中复制的所有行在提交到SQL Server 之前都放在同一批中。

    例如，如果源包含一百万行数据，而批量大小设置为默认值，则要到处理完第一百万行时才会提交数据。在这种情况下，最好以一千或一万（而不是一百万）为一批来提交数据。

  • 如果批量大小为一，表示把所处理的每行数据作为一批。

  • 转换数据任务检测出有错误的输入行既不添加到当前的批数据中，也不计为批数据中的行。例如，大小为 10 的批数据可能包含源中的第 1 到 12 行，其中第 3 行和第 4 行包含错误格式的日期，这两行不复制到目的行。在这种情况下，不能认为第三批数据包含源中的第 21 到 30 行。

配置分批处理数据的错误选项之前，应考虑以下事项：

  • 输入转换数据任务的最大错误计数值时，也指定了转换数据任务检测到的行级错误数与批处理错误数的总和。当超过"最大错误计数"值时，任务执行将终止。

  • 因为由转换数据任务检测到的错误行在批处理提交之前被废弃，所以这些错误不触发也不计为批处理错误。在目的行捕获的错误将使批处理失败，并且不论批处理中有多少行都增加一个错误计数。

  • 可以设置一个选项，以便在超过最大错误计数值时触发提交当前的批处理。仅当预测的错误类型为可由转换数据任务检测到的行级错误时，该选项才有用。
批处理和包事务

批处理的成败与包事务无关。有关更多信息，请参见配置 DTS 事务属性。

如果转换数据任务参与了包事务，则只有在提交包事务之后才提交成功添加的批处理。

配置转换数据任务

在 DTS 设计器中，按以下步骤配置转换数据任务：

  1. 配置连接。必须首先建立一个源与目的的连接。

    配置转换数据任务的连接

    企业管理器

    企业管理器

    有关更多信息，请参见 DTS 连接。

  2. 添加该任务。按照数据流的顺序（从源到目的）选择所需的连接，然后再添加该任务。

    创建转换数据任务

    企业管理器

    企业管理器

    有关更多信息，请参见 DTS 设计器示例：复制 Northwind 数据。

  3. 配置列级转换。

    如果没有使用默认的转换映射，就需要选择转换的源行和目的行，选择转换类型，并设置转换的属性（按照转换类型的要求）。对于需要配置的每个转换重复此步骤。

    为转换数据任务配置新的转换

    企业管理器

    企业管理器

    有关更多信息，请参见映射列转换和转换类型。

  4. 选择性地配置将在转换中使用的任何查找连接。

    有关更多信息，请参见查找查询。

  5. 选择性地自定义快速装载选项和批处理选项（如果目的连接是用于 SQL Server 的 Microsoft OLE DB 提供程序）。

    启用转换数据任务快速装载选项

    企业管理器

    企业管理器

    配置快速装载批处理选项

    企业管理器

    企业管理器

  6. 选择性地选择并自定义数据抽取异常错误文件，以便将其用来排除行数据处理故障。

    配置数据抽取异常错误文件

    企业管理器

    企业管理器

请参见

数据驱动的查询任务

多阶段数据抽取功能

ParallelDataDump 任务对象

大容量复制行集

优化大容量复制性能


数据驱动的查询任务

数据驱动的查询任务用于对数据执行基于 Transact-SQL 的灵活操作，包括存储过程和 INSERT、UPDATE 或 DELETE 语句。对于源行集中的每一行，数据驱动的查询任务都选择、自定义并执行一个 SQL 语句。通过在 Microsoft® ActiveX® 脚本转换中设置的常量返回值，可以选择要执行的语句。根据您在脚本中使用的返回常量，将对每一个源行执行四个不同的参数化 SQL 语句中的一个。

设计数据驱动的查询任务时，需要确定该任务应该包括单个查询还是多个查询。例如，如果只需要删除数据的任务，则使用单个查询（一个删除查询）。如果想更新一些行并删除其它行，就需要使用两个查询（一个更新查询和一个删除查询）。如果使用多个查询，需要编写提供条件逻辑的脚本代码。该逻辑确定将各个查询类型应用于数据的时间。

利用数据驱动的查询任务，可以：

  • 运行任何大型的更新集合，而这些更新不必是插入数据。例如，根据某一数据库生成的关键字列表，可以从另一数据库中清除过期的历史数据。

  • 执行传统文件维护。例如，可以根据记录先前的存在状态或其它的一些外部因素来选择性地插入或更新记录。

  • 自定义 Microsoft SQL Server™ 可转换订阅内容，用于在复制过程中分发和转换增量更改。例如，可以自定义各订阅服务器的响应插入、删除或更新请求。

当必须对多个源行的每一行执行下面的一个操作，需使用数据驱动的查询任务：

  • 在多个删除操作中选择。

    - 或者 -

  • 执行一次非插入编辑（例如，执行一次更新或删除操作，或执行一个存储过程）。

    转换数据任务和大容量插入任务最适用于插入操作。只有当这些任务达不到应用程序的要求时，才应选择数据驱动的查询任务来执行插入操作。

可以使用 DTS 设计器或 DTS 对象模型来创建和管理数据驱动的查询任务。有关编写数据驱动的查询任务的更多信息，请参见 DataDrivenQueryTask2 对象和使用 Visual Basic 创建可转换订阅。

请参见

转换数据任务

在 DTS 中使用 ActiveX 脚本

在 DTS 中使用参数化查询


数据驱动的查询任务中的数据流

当使用数据驱动的查询任务时，数据流如下所示：

  1. 从源中选择行。

  2. Microsoft® ActiveX® 脚本（和可能的其它转换）转换每一行。ActiveX 脚本的返回值确定随后将选择的查询。

  3. 转换结果映射到绑定表。此时没有向目的写入任何数据。用绑定表来确定列的属性（如数据类型、小数位数和精度），这些属性将在下一步中由参数化查询来使用。

  4. 对于每一行，绑定表中的值都映射到所选的查询，然后执行该查询。

  5. 执行查询时，将行写到目的中。

请参见

在 DTS 中使用 ActiveX 脚本

在 DTS 中使用参数化查询

在 DTS 中使用返回代码


生成数据驱动的查询

虽然用数据驱动的查询任务生成的数据驱动的查询可能具有不同的复杂程度，但在所有情况下应该使用相同的基本步骤生成数据驱动的查询。

以下示例显示如何使用数据转换服务 (DTS) 设计器中的数据驱动的查询任务来生成数据驱动的查询，其中一个是简单查询一个是复杂查询。在第一例中，每一源行都导致一个目的行的更新。在此例中只使用一个查询类型，即更新查询。在第二例中，使用的是多个查询类型，即一个更新查询和一个删除查询。

用单个查询类型更新目的行

  1. 定义源数据。

    源数据可以是一个表，也可以是 SELECT 语句、参数化 SELECT 语句或存储过程的结果。数据源在"数据驱动的查询任务属性"对话框的"源"选项卡中选择。

  2. 定义绑定表。

    该绑定表使您能够在源数据出现在 SQL 语句中之前转换源数据。数据驱动的查询任务不会对目的作出任何实际的更改，除非您在查询中特别请求了更改。绑定表必须是现有的表。该表用于定义绑定参数的架构。该绑定表中的列必须与参数化查询中将按照类型写入的列（步骤 5）相匹配。绑定表在"数据驱动的查询任务属性"对话框的"绑定"选项卡中声明。

  3. 使用 Microsoft® ActiveX® 脚本提供决策逻辑。

    通过在"ActiveX 脚本转换属性"对话框的文本框中创建 ActiveX 脚本代码，可以确定将要执行的查询。要显示该对话框，在"数据驱动的查询任务属性"对话框的"转换"选项卡上双击转换的列映射行即可。

    说明 默认情况下，数据驱动的查询任务将所有源列当作单个转换映射到绑定表中的所有列。映射显示在"数据驱动的查询任务属性"对话框的"转换"选项卡上。建议不要将多个 ActiveX 脚本用于一个数据驱动的查询任务，否则会降低性能。有关更多信息，请参见增强 DTS 包的性能。

  4. 编辑 ActiveX 脚本，使返回代码与 DTSTransformStat_UpdateQuery 匹配。

    任何查询类型的默认返回代码都是 DTSTransformStat_InsertQuery。不过，查询类型标签仅仅是建议。虽然可以使用默认的插入查询来执行更新查询以方便阅读，但最好将返回代码更改为相应的代码，以进行更新。

    ActiveX 脚本包含对 DTSDestination 列集合的引用，而这些列引用的是绑定表（步骤 2）。SQL 操作的参数将应用于该表。

  5. 创建更新查询。

    在"数据驱动的查询任务属性"对话框的"查询"选项卡上，单击"查询类型"列表中的"更新"。通过将查询键入编辑框或使用 DTS 查询设计器，生成参数化查询。将问号 (?) 用作参数的占位符，所处理的数据将添入该位置。

    绑定表列的属性必须与它所指派的任何参数的属性相匹配。

    在"查询"选项卡，每一网格显示在所选查询（更新）中输入的每个参数 (?) 的一行。默认情况下，这些行将从先前定义的转换依次映射到绑定表列。有关更多信息，请参见在 DTS 中使用参数化查询。

使用多种查询更新或删除目的行

  1. 定义源数据和绑定表，步骤如上例所示（步骤 1 和 2）。

  2. 提供应用于各个查询类型的决策逻辑。

    脚本将根据所提供的条件逻辑来返回四个返回代码中的一个。返回代码指定 DTS 为当前源行执行的查询。编辑"ActiveX 脚本转换属性"对话框的文本框中的默认 ActiveX 脚本，以包含该逻辑和返回代码。

    用来确定查询类型的决策逻辑通常由分支语句（IF-THEN-ELSE 或 CASE）构成。

    在本例中使用的是以下两个返回代码：

    DTSTransformStat_UpdateQuery

    DTSTransformStat_DeleteQuery

    有关更多信息，请参见在 DTS 中使用 ActiveX 脚本和在 DTS 中使用返回代码。

  3. 创建查询。

    对于每个查询，从"数据驱动的查询任务属性"对话框"查询"选项卡上的"查询类型"列表中选择一个查询类型。通过在文本编辑框中键入查询或使用 DTS 查询设计器来生成参数化查询。

    这些查询不需要具有相同数量的参数，也不需要映射到绑定表中的相同列。查询和映射分别进行编辑。

请参见

在 DTS 中使用 ActiveX 脚本

在 DTS 中使用返回代码


数据驱动的查询示例：更改客户帐号

以下示例将详细介绍使用数据驱动的查询任务的一个情况：一个源行触发三个不同编辑操作（其中两个不是插入操作）中的一个。

现在有一个 Account 表，其中有 CustomerID 行和 CompanyName 行。CustomerID 作为键：

CREATE TABLE Account (
   CustomerID nchar (5) NOT NULL,
   CompanyName nvarchar (40) NOT NULL )

所需的 Account 表的更改存储在 AccountChange 表中。该表包含 CustomerID 和 CompanyName 列以及 ChangeCode 列：

CREATE TABLE AccountChange (
   CustomerID nchar (5)  NOT NULL,
   ChangeCode nchar (10) NOT NULL,
   CompanyName nvarchar (40)  NULL )

不同的 ChangeCode 值用于请求不同的 Account 表修改。

ChangeCode | 所需的操作
新建 | 将新客户添加到 Account 表中。
更改 | 更改现有客户的 CompanyName。
删除 | 从 Account 表中删除客户行。

AccountChange 用作源。每一个 AccountChange 行都触发这三个动作中的一个。这些动作将由 INSERT、UPDATE 和 DELETE 查询代表。

说明 在本例中，所有更改都是对单个表的更改。不过，这并不是数据驱动的查询任务所要求的。该任务只要求受到影响的数据都位于同一连接。

指定查询语句

在确定数据驱动的查询任务的适当问题后，首先应指定多达四个参数化 SQL 语句来执行所要求的编辑操作。

每一操作都需要一个 SQL 查询或一个存储过程调用。这些语句通过用问号替换任何表达式来进行参数化，而每个源行的表达式都各不相同。例如，两个更改操作可能触发以下命令：

UPDATE Account SET CompanyName = 'Big Pizza' WHERE CustomerID = 'MARS'
UPDATE Account SET CompanyName = 'Tasty Gyro' WHERE CustomerID = 'ZEUS'

经过参数化后，UPDATE 查询读取：

UPDATE Account SET CompanyName = ? WHERE CustomerID = ?

运行时，问号将被从源列数据中提取（或基于源列数据）的值替换。

存储过程调用的参数化与查询的参数化相似，也用问号替换参数：

sp_updatebalance ?, 'Credit', ?

新操作和删除操作的参数化查询如下所示：

INSERT INTO Account (CustomerID, CompanyName) VALUES (?, ?)
DELETE FROM Account WHERE (CustomerID = ?)
给语句指派查询类型

为了引用 SQL 语句，需给每个语句指派一个名称，即查询类型。Microsoft® ActiveX® 脚本代码返回的查询类型用于选择要执行的 SQL 语句。数据转换服务 (DTS) 提供了以下四个名称：

  • 插入

  • 更新

  • 删除

  • 用户

这些查询类型只是指派给每个语句的唯一标识符。事实上，可以执行连接所支持的任何 SQL 操作。例如，可以执行四种不同的更新、四种不同的插入、更新插入混合或存储过程。

本例是可用查询类型与参数化 SQL 语句相匹配的应用程序之一。所以，其赋值如下所示。

查询类型 参数化查询
插入
INSERT INTO Account (CustomerID, CompanyName) VALUES (?, ?)
更新
UPDATE Account SET CompanyName = ? WHERE CustomerID = ?
删除
DELETE FROM Account WHERE (CustomerID = ?)

指定绑定表

给 SQL 语句指派查询类型之后，需要指定一个绑定表，使该表的列与参数化查询中的参数相匹配。该绑定表使您能够在源数据出现在 SQL 语句中之前转换源数据。例如：

  • 客户名可以是大写字符。

  • 地址行可以通过连接几个字段来构成。

  • 城市信息可以根据源数据中的邮政编码来查找。

数据驱动的查询任务不会对目的作出任何实际的更改，除非您在查询中特别请求了更改。

要指定绑定表，应列出查询要求的所有参数。然后，查看现有表中是否有一个表包含列表中的所有列。如果找到这样一个表，就可以将它用作绑定表。如果现有表都不包含要求的所有参数，则应创建一个能够包含所有参数的新表。

说明 数据驱动的查询任务要求源表和绑定表使用不同的连接。

例如，上述查询使用两个参数：

  • CustomerID

  • CompanyName

查看数据库后找到两个表，它们都包含这两列：Account 和 AccountChange。由于 AccountChange 很可能用作源，所以最好选择 Account 来作为绑定表。不必创建新表。

在本例中，绑定表也就是查询对其进行更新的表。这种情况经常发生，但并不是数据驱动的查询任务所要求的，因为对于查询而言，绑定表的存在只是为了映射元数据（大小、小数位数、精度和为空性）。它并不会实际写入。只有查询操作才会影响数据。

指定源行集

指定绑定表之后，必须选择一个现有表作为源或指定一个新的源行集。每个源行必须包含足够的信息，以便：

  • 确定要执行的相应查询。

  • 填写所选查询要求的任何参数。

如果某一个表中提供有这些信息，就可以将其作为源。否则，应创建一个 SQL 查询，在单个源行集中收集所要求的信息。

如有必要，可使用自定义 ActiveX 脚本代码（可能引用 DTS 查找查询）来确定要执行的正确查询。源数据可以立即复制到绑定列参数，也可以通过 ActiveX 代码或 DTS 自定义转换进行中间处理。

在本例中，AccountChange 表将用作源。它满足以下两项要求：

  • ChangeCode 列确定对查询的选择。

  • CustomerID 和 CompanyName 列足以填写要求的所有参数。
指定 ActiveX 转换

要选择将执行的查询，必须编写一个 ActiveX 转换的代码。该脚本返回四个值中一个，然后用返回值来选择要执行的查询。此外，可以选择通过包含 ActiveX 编码来写入目的参数。

返回值及其相关查询类型如下。

返回值 | 执行查询类型
DTSTransformstat_InsertQuery | 插入
DTSTransformstat_UpdateQuery | 更新
DTSTransformstat_DeleteQuery | 删除
DTSTransformstat_UserQuery | 用户

这些查询类型只是某一查询的标识符。例如，可以将插入类型指派给删除 (DELETE) 查询。如果脚本返回 DTSTransformstat_InsertQuery，将触发 DELETE 查询。

通常情况下，代码形式为嵌套的 IF 或 SELECT CASE 结构。例如，要根据 ChangeCode 的值在三个查询中进行选择，可使用以下代码：

Select Case Trim(DTSSource("ChangeCode"))
   Case "New"
      Main = DTSTransformStat_InsertQuery
   Case "Change"
      Main = DTSTransformStat_UpdateQuery
   Case "Delete"
      Main = DTSTransformStat_DeleteQuery
   Case Else
      Main = DTSTransformStat_SkipRow
End Select

以上代码对应于返回 DTSTransformStat_SkipRow 之前的错误 ChangeCode 值。没有为源行触发任何查询。

可以使用复制列转换或其它列级转换来填充绑定表列，也可以通过 ActiveX 转换中的附加代码填充：

DTSDestination("CustomerID") = DTSSource("CustomerID")
DTSDestination("CompanyName") = DTSSource("CompanyName")

无需填写所有目的列，填写所选查询要求的目的列即可。

请参见

查找查询

DTS 转换

数据驱动的查询任务


数据驱动的查询示例：文件维护

以下示例先提出一个文件维护问题，然后介绍了准备数据驱动的查询任务解决方案的必需步骤。

有关数据驱动的查询任务基本概念的更多信息，请参见数据驱动的查询任务。

确定数据驱动查询问题

现在有一个 Account 表，其中有 CustomerID 行和 CompanyName 行。CustomerID 作为键：

CREATE TABLE Account (
   CustomerID nchar (5) NOT NULL,
   CompanyName nvarchar (40) NOT NULL )

还有一个 AccountJournal 表。每次客户更改余额时，就会在该表中写入一行：

CREATE TABLE AccountJournal (
   UpdateID int NOT NULL,
   CustomerID char (5) NOT NULL,
   JournalAmount money NOT NULL )

需要将 AccountUpdate 表用作源表：

CREATE TABLE AccountUpdate (
   UpdateID int IDENTITY (1, 1) NOT NULL,
   UpdateCode char (10) NOT NULL,
   CustomerID char (5) NOT NULL,
   CompanyName char (30) NULL,
   UpdateAmount money  NULL )

UpdateCode 的不同值用于请求不同的 Account 和 AccountJournal 修改。

UpdateCode | 所需的操作
Purchase | 写入一个新的 AccountJournal 行，并将 JournalAmount 设置为等于 UpdateAmount。
Payment | 写入一个新的 AccountJournal 行，并将 JournalAmount 设置为等于 UpdateAmount * -1。
New | 如果某个客户不存在，则添加该客户。如果该客户已存在，则更新旧的 CompanyName。

数据驱动的查询任务适用于解决此问题。AccountUpdate 表中的每一条目都触发三个不同查询中的一个。

指定查询语句

要解决此问题，需要三个参数化 SQL 语句：

INSERT AccountJournal (UpdateID, CustomerID, JournalAmount)
   VALUES (?, ?, ?)
INSERT INTO Account (CustomerID, CompanyName) VALUES (?, ?)
UPDATE Account SET CompanyName = ?  WHERE CustomerID = ?

第一个查询在一个"Purchase"或"Payment"中将一行添加到 AccountJournal 表；第二个查询在该客户原先没有存档的情况下添加一个新的帐户；最后一个查询更新现有客户的 CompanyName。

给语句指派查询类型

现在有两个插入 (INSERT) 查询和一个更新 (UPDATE) 查询。这意味着查询类型将无法与实际的查询内容相匹配。

查询类型 参数化查询
插入
INSERT AccountJournal (UpdateID, CustomerID, JournalAmount)

   VALUES (?, ?, ?)
更新
UPDATE Account SET CompanyName = ?  WHERE CustomerID = ?
用户
INSERT INTO Account (CustomerID, CompanyName) VALUES (?, ?)

第二个插入 (INSERT) 查询可任意指派给用户查询类型。删除类型也是如此。

指定绑定表

绑定表提供 SQL 参数的名称和数据类型。查询可用的参数如下：

  • UpdateID

  • CustomerID

  • JournalAmount

  • CompanyName

在数据库中没有包含所有这些列的表。因而必须创建一个新的绑定表：

CREATE TABLE AccountDestination (
   UpdateID int NOT NULL,
   CustomerID char (5) NOT NULL,
   CompanyName char (30) NULL,
   JournalAmount money NULL )

该表中不会写入任何行。其作用仅仅是提供一个空行，作为 SQL 语句参数的中间临时区。

指定源行集

AccountUpdate 表还不具备作为源表的条件：

  • 根据该客户是否存档，UpdateCode 的一个"New"值将触发一个更新 (UPDATE) 或插入 (INSERT)。然而，在 AccountUpdate 表中并没有客户存档状态。

  • 在 AccountUpdate 中没有找到绑定列 JournalAmount。purchase 等于 UpdateAmount，但 payment 必须通过 UpdateAmount 乘以 –1 来计算。

要解决这两个问题中的第一个，可使用一个 SELECT 语句将客户存档状态并入源行集。新的源 SQL 语句通过一个子查询对 OnFile 进行初始化：

SELECT UpdateID, UpdateCode, CustomerID, CompanyName, UpdateAmount,
   OnFile = (SELECT COUNT(*)FROM Account
                WHERE CustomerID = AccountUpdate.CustomerID)
   FROM AccountUpdate

第二个问题可通过 Microsoft® ActiveX® 代码来解决。

指定 ActiveX 转换

在本例中，数据转换服务 (DTS) 转换执行以下三项任务：

  • 正确地选择要执行的查询。

  • 正确计算 JournalAmount 的值。

  • 写入所要求的绑定表列。

单个 ActiveX 脚本转换就足以满足这些要求：

Function Main()
   DTSDestination("UpdateID") = DTSSource("UpdateID")
   DTSDestination("CustomerID") = DTSSource("CustomerID")
   DTSDestination("CompanyName") = DTSSource("CompanyName")
   Select Case Trim(DTSSource("UpdateCode"))
      Case "Purchase"
         DTSDestination("JournalAmount") = DTSSource("UpdateAmount")
         Main = DTSTransformstat_InsertQuery
      Case "Payment"
         DTSDestination("JournalAmount") = -1 * DTSSource("UpdateAmount")
         Main = DTSTransformstat_InsertQuery
      Case "New"
         If DTSSource("OnFile") = 1 Then
            Main = DTSTransformstat_UpdateQuery
         Else
            Main = DTSTransformstat_UserQuery
         End If
   End Select
End Function

该脚本首先对三个绑定表列进行初始化，然后用一个 SELECT CASE 语句填充剩余的参数并设置返回值。"Purchase"和"Payment"都会导致插入一个新的 AccountJournal 记录。区别仅在于 JournalAmount 参数的计算方法不同。在"New"中，源 OnFile 值用于确定是更新现有客户还是插入新的客户。这两种可能的查询都不需要 JournalAmount，所以无需进行初始化。


多阶段数据抽取功能

数据转换服务 (DTS) 为高级用户提供了添加用于自定义各数据抽取操作阶段的程序的功能。通过自定义数据抽取操作，可以在包中添加多种多样的功能。例如：

  • 行级重新启动功能，即无需重新装载已经处理的大量行就可重新启动数据抽取的功能。可以通过添加函数来保存已处理的行数据、批数据或部分批数据，并将这些数据写回到源或状态表，以备将来使用。

  • 个别处理各种插入或转换错误。例如，可以通过添加特殊的错误处理程序来自定义 NULL 数据处理问题或约束违反条件。

  • 自定义数据抽取的初始或终止步骤。例如，在数据抽取的初始化阶段，在将 XML（可扩展标记语言）数据写入某个文件之前，可以将架构标题写入该文件。
数据抽取进程

多阶段数据选项使您能够在数据抽取操作的某些阶段访问数据抽取并添加功能。将一行数据从源复制到目的时，数据抽取的基本进程如下：

  • 提取一行源数据。

  • 选择性地将转换应用于该行。

  • 尝试将该行数据插入目的缓冲区。

  • 处理异常错误。

  • 如果指定了一个批处理，结果将存储到所指定的批中。

  • 重复上述步骤，直至达到所指定的批处理大小，然后提交存储在缓冲区中的数据，接着开始处理下一批数据或将该批数据滚回。

当数据抽取处理完最后一行数据后，该任务随即结束，同时数据抽取操作终止。

数据抽取阶段

下图显示了数据抽取的阶段及其对应的数据流。

图中的数据流（在图中的灰色扩展区中有详细说明）：

  • 开始是行转换阶段，在此阶段从源中复制一行数据并应用所有的转换。

  • 如果转换成功，该行的数据将转到下一阶段。如果转换不成功，则将出现"转换失败"错误，并提取下一行数据。

  • 进入到行转换后阶段，在此阶段将尝试把行复制到目的缓冲区。该操作有两种可能的结果：插入成功或插入失败。

  • 最后是批处理完成阶段，在此阶段行数据将存储为一批，最后可能插入或不提交行数据，这取决于是否为该任务配置了批处理以及所指定的批处理大小。

下图显示了与行数据处理不直接相关的其它三个数据抽取阶段：源前、源后和抽取完成。这三个阶段涉及到在逐行复制数据、转换和提交（或回滚）进程之前或之后的事件。例如，源前阶段出现在提取第一行数据之前。源后阶段出现在处理完最后一行数据之后，而抽取完成阶段出现在转换任务结束时。

访问数据抽取阶段

要显示 DTS 设计器中的多阶段数据抽取选项，必须在 SQL Server 企业管理器选择一个选项。选择多阶段数据抽取选项之后，DTS 设计器中打开的任何包仍能够访问该功能及进行将来的会话。默认情况下，没有选中该选项。

激活多阶段数据抽取功能

企业管理器

企业管理器

配置数据抽取阶段

默认情况下，数据抽取设置为只提供行转换阶段。如果在转换数据任务、数据驱动的查询任务、并行数据抽取任务中映射列级转换时没有选择任何阶段，就将默认为行转换阶段。对于高级用户，他们如果要在包中添加功能以支持任何数据抽取阶段，可执行以下操作：

  • 为将要自定义的每一数据抽取阶段编写一个 Microsoft® ActiveX® 脚本阶段函数。如果使用 ActiveX 脚本函数来自定义数据抽取阶段，则不需要包以外的任何其它编码。

    有关更多信息，请参见 DTSTransformScriptProperties2 对象和分阶段转换示例。

    使用 ActiveX 脚本添加多阶段数据抽取转换功能

    企业管理器

    企业管理器

  • 用 Microsoft Visual C++® 创建一个 COM 对象，以自定义所选的数据抽取阶段。将该程序开发为包以外的程序，并为所选的各个转换阶段调用该程序。当通过 ActiveX 脚本访问数据抽取阶段时，所选的每个阶段都使用一个不同的函数和入口点。而该方法则不同，它只提供一个入口点，由多个数据抽取阶段在执行数据抽取任务时进行调用。

    说明 不能在 Microsoft Visual Basic® 中创建 COM 对象来自定义数据抽取阶段。

    调用自定义一个或多个数据抽取阶段的 COM 对象

    企业管理器

    企业管理器

数据抽取阶段

以下各部分提供有关可以通过 ActiveX 脚本或通过自定义 COM 对象来自定义的数据抽取阶段的信息。

说明 当编写访问同一数据抽取阶段的多个函数时，应使用最后一个函数的返回值。要保留先前某一阶段函数的返回值，必须从后继阶段函数中返回该值。

源前阶段

源前阶段在第一次提取源数据之前执行。整个数据抽取操作中，该阶段只执行一次，除非在阶段函数中使用了 DTSTransformStat_SkipFetch 返回代码（这会导致一个循环）。

可以为转换添加源前数据抽取函数，以将包含元数据信息的标题行写入文件，然后对对象、连接和内存进行初始化，以备在随后的数据抽取阶段中使用。

行转换阶段

这是默认的数据抽取阶段，它在转换数据任务或数据驱动的查询任务的"转换"映射选项卡上提供。"ActiveX 脚本转换属性"对话框内提供的 Main 函数占位符是添加该阶段的自定义脚本代码时所用的默认入口点。行转换阶段允许对源数据和元数据进行读访问，对目的数据进行写访问。

行转换后阶段

行转换后阶段在数据抽取的行转换阶段之后执行，由转换失败、插入成功和插入失败子阶段组成。在所有子阶段当中，如下所列，插入成功和插入失败相互排斥；对于任一指定行，只会出现其中一个子阶段：

  • 转换失败时。该子阶段表示正常转换阶段的失败（当行转换返回 DTSTransformStat_Error 或 DTSTransformStat_ExceptionRow 时）。通过访问该子阶段可以处理转换错误（例如类型不匹配）、替代转换返回的值和继续执行处理。一旦出现转换错误，对该行的处理可能（也可能不再）继续。如果处理继续，只会出现以下子阶段中的一个。

  • 插入成功时。这一子阶段表示插入操作的成功（如果转换为数据驱动的查询任务的一部分，则表示插入查询的成功）。无法在已返回状态下指定任何目的操作。

  • 插入失败时。这一子阶段表示插入操作的失败（如果转换为数据驱动的查询任务的一部分，则表示插入查询的失败）。无法在已返回状态下指定任何目的操作。
批处理完成时

根据在转换数据任务的"选项"选项卡上的"插入批处理大小"中指定的值，当批处理或行处理成功或失败时，可以调用该数据抽取阶段。数据驱动的查询任务或并行数据抽取任务的批处理大小只能以程序方式来设置；如果要编写其中一个任务的"批处理完成时"函数，就必须以程序方式编写。

抽取完成时

可以在转换任务结束时（处理完所有行之后）自定义这一阶段。使用写入"抽取完成时"的函数释放资源，并提交在数据抽取过程中全局变量中含有的数据。无法通过"抽取完成时"函数访问此数据。

源数据后

在完成任务后访问此阶段，以处理目的数据。和"抽取完成时"函数不一样，写入此阶段的函数允许访问目的数据。源数据后函数常用于将页脚行写入文件、释放资源和提交全局变量中含有的数据。


复制及管理数据的任务

数据转换服务 (DTS) 包含几个专门用于复制及管理数据和元数据的任务。

任务 | 描述
大容量插入任务 | 将大量的数据从文本文件复制到 Microsoft® SQL Server™ 表或视图中。
执行 SQL 任务 | 在包执行期间运行 SQL 语句，并且保存那些作为查询结果的数据。
复制 SQL Server 对象任务 | 创建 SQL Server 对象或将 SQL Server 对象（如表、视图、索引及约束）从 SQL Server 的一个实例复制到另一个。
传输数据库对象任务 | 复制整个数据库、作业、错误信息、登录和 master 数据库存储过程。


大容量插入任务

大容量插入任务可提供最快的方法，用于将大量的数据复制到 Microsoft® SQL Server™ 表或视图。为了确保高速数据移动，在将数据从源文件移动到表或视图时，不能对它进行转换。

例如，假定您的公司在大型机系统上保留了百万行的产品列表。您的电子贸易系统使用 SQL Server 2000 填充 Web 页。您需要在晚上用来自大型机的主产品列表更新产品表。若要完成这个任务，请使用制表符分隔格式保存产品列表，然后使用大容量插入任务将数据直接复制到 SQL Server 表。现在，利用更新过的产品数据将表刷新。

配置大容量插入任务

大容量插入任务封装了一个 Transact-SQL BULK INSERT 语句，在任务执行期间运行该语句。在数据转换服务 (DTS) 设计器中，可以在"大容量插入属性"对话框中设置 BULK INSERT 语句的参数。不能图形化获得的任何 BULK INSERT 参数都设置为默认值。如果需要设置那些不能图形化获得的参数，可以使用 BulkInsertTask 对象或 bcp 实用工具通过编程设置它们。

将大容量插入任务与事务一同使用

如果没有设置批处理大小，那么整个大容量复制操作都被看作是一个事务。如果设置了批处理大小，那么每个批处理构成一个事务，当批处理完成时，该事务也就被提交。

大容量插入任务的行为取决于是否将该任务引入到包事务。如果大容量插入任务没有引入包事务，那么就在尝试下一个批处理之前提交每一个没有错误的批处理，并将其作为一个单元。如果大容量插入任务引入到包事务，那么在任务结束时，没有错误的批处理保留在事务中。这些批处理要受到步骤或包的提交或回滚操作的影响。

大容量插入任务中的失败并不自动地回滚那些已成功装载的批处理，任务成功也不自动地提交它们。只有在响应包和工作流程属性设置时，才会发生提交及回滚操作。有关更多信息，请参见 DTS 事务基础知识。

使用注意事项

在使用大容量插入任务之前，请注意以下事项：

  • 大容量插入任务只可以将数据从文本文件传输到 SQL Server 表或视图中。为了从数据库管理系统 (DBMS) 传输数据，需要从源程序将数据导出到一个数据文件，然后再将数据从数据文件导入到 SQL Server 表或视图。

  • 数据目的必须是由 SQL Server 创建的表或视图。如果目的表或视图已经包含数据，那么当大容量插入任务运行时，将追加新的数据。

  • 可以在大容量插入任务对象中使用格式文件。如果已经通过 bcp 实用工具创建了格式文件，则可以在大容量插入任务中指定其路径。给出的路径必须要考虑服务器。有关格式文件的更多信息，请参见使用格式文件。
指定源和目的

当指定文本源文件的路径时，请考虑以下事项：

  • 当运行大容量插入任务时，只有 sysadmin 固定服务器角色的成员才能执行这个包。

  • 不管文件的位置如何，服务器必须对文件和目的数据库都有权限。

  • 服务器将运行大容量插入任务。因此，给定的路径必须要考虑服务器。
优化性能

为了优化性能，请考虑以下事项：

  • 如果文本文件位于运行着 SQL Server 实例的同一台计算机上，那么复制操作以更快的速度进行，这是因为没有通过网络移动数据。

  • 大容量插入任务并不记录引发错误的行。如果需要捕获这样的信息，那么另一个任务（转换数据任务）可以将引发错误的行捕获到一个异常错误文件。但是，将错误写入日志将减慢数据传输。如果速度是要优先考虑的问题，那么请使用大容量插入任务。如果捕获错误更为重要，那么请使用转换数据任务。

将大容量插入任务添加到 DTS 包

企业管理器

企业管理器

请参见

BULK INSERT

BulkInsertTask 对象


执行 SQL 任务

使用执行 SQL 任务，可以在包执行期间运行 SQL 语句。执行 SQL 任务也可以保存作为查询结果的数据。使用执行 SQL 任务，可以：

  • 填充多个全局变量。

  • 将从查询返回的完整行集保存到一个全局变量中。

  • 除去表。

  • 在装载事实数据表和维度表之前，重新创建它们。

  • 运行存储过程。

任务可以包含单个 SQL 语句，或者也可以包含按顺序执行的多个 SQL 语句。SQL 语句可以是 SELECT 命令，还可以运行存储过程，等等。

必须用源数据库管理系统 (DBMS) 的特有语言书写 SQL 语句。

在一个批处理中发送多个要执行的语句

如果任务中包含多个语句，那么可以将它们分组，然后可以一次执行一个批处理。为了标明批处理的结束，请使用 GO 命令。从一个 GO 命令到下一个 GO 命令的所有 SQL 语句都被发送到一个批处理，以便于 OLE DB 提供程序执行。

说明 对于可以被分组到一个批处理的 SQL 语句，其种类是有一定限制的。有关更多信息，请参见批处理。

例如，假定有三个表：一个表包含顾客订单，一个表包含日常订单汇总，另一个表包含本年度截止到目前的订单。更新完顾客订单表之后，可以使用执行 SQL 任务以运行两个存储过程，其中一个用于创建新的日常销售汇总，而另一个用于更新本年度截止到目前的订单汇总。下面的代码示例显示如何执行这两个存储过程：

Execute sp_UpdateDailySales
GO
Execute sp_UpdateYTDSales
GO
运行参数化查询

当源数据提供程序支持参数时，执行 SQL 任务可以使用全局变量将输入参数填充进 SQL 命令，这些命令包括查询及存储过程。可以书写一个参数化查询，在该查询中，通过使用问号作为参数占位符在运行时填充 SQL 语句中的值。然后，可以将全局变量映射到参数占位符，以指定在运行时将使用哪个全局变量取代问号。

执行带输入参数的存储过程

企业管理器

企业管理器

填充多个全局变量

执行 SQL 任务可以保存那些作为查询结果的数据。例如，可以运行一个从表中检索数据的 SELECT 语句。然后，通过将全局变量指派为任务中的输出参数，可以保存从查询返回的第一行，用返回的每一列的值填充多个全局变量。

下面的代码示例显示如何将 SELECT 语句（该语句运行在执行 SQL 任务中）的结果放入多个全局变量中。若要查看从查询返回的列，而这些列存储在全局变量中，可以在 Microsoft® ActiveX® 脚本任务中编写脚本。第二个示例将检索并显示从 SELECT 语句返回的四列。

将行值保存到全局变量中

企业管理器

企业管理器

检索行值数据

企业管理器

企业管理器

用整个行集填充单个全局变量

执行 SQL 任务可以保存从 SELECT 语句返回的整个行集，并将它指派给单个全局变量，而可以使用包保存该全局变量。可以将这样的全局变量视为一个脱接的 Microsoft ActiveX 数据对象 (ADO) 记录集。可以游览整个记录集，查询记录集以及操作由记录集返回的数据。可以访问所有的用于记录集的 ADO 方法及属性。因为不必重新连接到源表，所以访问存储在全局变量中的行集就比访问原始的表（数据就来自这个原始的表）更为迅速。但是，在使用脱接记录集时，必须考虑更新源数据的频繁程度，这是因为包所处理的数据可能会过时。

说明 将大的行集存储到一个全局变量中有可能会减慢包的执行，而且会使用大量的内存。用数据填充全局变量要花费时间，另外，如果在其它任务中使用全局变量作为查找表，则查找大的行集也要花费时间，这样会再次影响性能。

下面的代码示例显示如何将 SELECT 语句（它运行在执行 SQL 任务中）整个的结果集放入一个全局变量。若要查看从查询返回的并且存储在全局变量中的数据，可以在 ActiveX 脚本任务中书写脚本。第二个示例将检索并显示从查询返回的数据。

将整个行集保存到全局变量中

企业管理器

企业管理器

检索存储于全局变量中的行集数据

企业管理器

企业管理器

将执行 SQL 任务添加到 DTS 包

企业管理器

企业管理器

请参见

ExecuteSQLTask 对象

在 DTS 包中使用全局变量

GO

在 DTS 中使用参数化查询

使用语句参数


复制 SQL Server 对象任务

使用复制 SQL Server 对象任务可以将 Microsoft® SQL Server™ 对象从 SQL Server 的一个实例复制到另一个。可以传输对象（例如数据和表），也可以传输某些对象的定义（例如视图及存储过程）。其它的对象包括引用完整性约束及索引。

如果选择了表，则复制 SQL Server 对象任务将自动复制任何相关联的表和视图，而这些表和视图在选定的表上有外键约束。例如，如果从 pubs 数据库传输 employee 表，则还将传输 jobs 及 publishers 表。传输 jobs 表是因为在 employee 表及 jobs 表之间，在 jobs_id 字段上有外键关系。传输 publishers 表是因为在 employee 表和 publishers 表之间，在 pub_id 字段上有外键关系。

如果目的表或视图存在并且包含数据，则可以指定是重写或者追加传入的数据，还是除去并重新创建该表。

在传输对象时，只能从：

  • SQL Server 7.0 版的一个实例到另一个 SQL Server 7.0 版的实例。

  • SQL Server 7.0 的一个实例到 SQL Server 2000 的一个实例。

  • SQL Server 2000 的实例到另一个 SQL Server 2000 的实例。

当配置复制 SQL Server 对象任务时，不需要创建单独的源和目的连接。可以在"复制 SQL Server 对象属性"对话框中设置源和目的属性。

说明 如果源服务器升级到 SQL Server 2000 且执行包含复制 SQL Server 对象任务的 DTS 包（其中的源和目的都是 SQL Server 7.0 数据库），则该包可能失败。如果已升级源服务器，则需要刷新每个复制 SQL Server 对象任务，其方法是在 SQL Server 2000 中打开该包，使用上面的配置打开每个复制 SQL Server 对象任务，并单击"目的"选项卡，然后对每个任务分别单击"确定"按钮。

将 DTS 任务添加到 DTS 包

企业管理器

企业管理器

请参见

传输对象

Transfer2 对象

TransferObjectsTask 对象

TransferObjectsTask2 对象


传输数据库对象任务

通常情况下，使用复制 SQL Server 对象任务将数据库对象从一个数据库复制到另一个数据库。然而，可使用传输数据库对象任务复制服务器范围的信息，这些信息并不一定存在于个别的数据库中。这些任务适用于复制 SQL Server 对象任务无法处理的情况。

说明 传输数据库对象任务是复制数据库向导所使用的自定义任务。有关更多信息，请参见使用复制数据库向导。

传输数据库任务

使用该任务将 Microsoft® SQL Server™ 数据库从 SQL Server 7.0 版或 SQL Server 2000 的一个实例复制或移动到另一个 SQL Server 2000 实例。当配置该任务时，指定每个数据库，指出是否将移动或复制每个数据库，并指定最后得到的数据和日志文件的位置。

传输错误信息任务

使用该任务复制由 sp_addmessage 系统存储过程创建的用户指定的错误信息，从 SQL Server 7.0 或 SQL Server 2000 的一个实例复制到另一个 SQL Server 2000 实例。当配置该任务时，指定源服务器和目的服务器以及要传输的错误信息。

传输登录任务

使用该任务将登录从 SQL Server 7.0 或 SQL Server 2000 的一个实例复制到另一个 SQL Server 2000 实例。当配置该任务时，指定源服务器和目的服务器、要移动或复制的数据库以及要传输的登录。

传输作业任务

使用该任务将作业从 SQL Server 7.0 或 SQL Server 2000 的一个实例复制到另一个 SQL Server 2000 实例。当配置该任务时，指定源服务器和目的服务器以及要复制的作业。

传输主存储过程任务

使用该任务将存储过程从 SQL Server 7.0 或 SQL Server 2000 的一个实例上的 master 数据库复制到另一个 SQL Server 2000 实例上的 master 数据库。当配置该任务时，指定源服务器和目的服务器以及要复制的存储过程。

说明 如果撤消注册传输数据库对象任务并希望重新注册该任务，请执行下列步骤：在"任务"菜单中单击"注册自定义任务"，并单击浏览 (...) 按钮，然后打开 Cdwtasks.dll。

请参见

复制 SQL Server 对象任务

sp_addmessage


起作业作用的任务

数据转换服务 (DTS) 包含许多类似作业的任务，执行这些任务对于包含任务的包来说是外部操作。

任务 | 描述
ActiveX 脚本任务 | 使用脚本代码执行在 DTS 设计器的其它任务中不可用的功能。
动态属性任务 | 在包运行时检索来自 DTS 包的外部数据源的值，并将这些值指派给选定的包属性。
执行包任务 | 作为工作流的一部分运行其它 DTS 包。
执行进程任务 | 将可执行程序或批处理文件作为包的一部分运行。
文件传输协议任务 | 作为包工作流的一部分从远程服务器或 Internet 位置下载数据文件。
消息队列任务 | 使用消息队列任务在 DTS 包之间发送和接收消息。
发送邮件任务 | 以任务的形式发送电子邮件消息。


ActiveX 脚本任务

使用 ActiveX 脚本任务可以编写代码，执行在数据转换服务 (DTS) 设计器的其它任务中不可用的功能。例如：

  • 当执行包时，可以用目标数据中状态的合法缩写取代源数据中两位数字的状态代码。

  • 如果目的数据是一个要从中创建邮寄标签的表，则可以将"title"列设置为"Mr"、"Mrs."或默认值空格?

  • 可以验证源数据中重要的列，并跳过包含无效数据的记录以防止这些记录被复制到目标中。

有关更多信息，请参见在 DTS 中使用 ActiveX 脚本。

要执行 ActiveX 脚本，必须在要运行该包的计算机（例如开发计算机和产品计算机）上安装脚本语言库。可用来编写您自己的脚本的语言包括 Microsoft Visual Basic® Scripting Edition (VBScript) 和 Microsoft JScript®。

重要 ActiveX 脚本在执行源数据的每一行时会影响到 DTS 包的执行速度。因此，如果性能是首要考虑的问题，则在生成包时必须谨慎地使用脚本。有关更多信息，请参见增强 DTS 包的性能。

将 DTS 任务添加到 DTS 包

企业管理器

请参见

ActiveXScript 属性 (DTS)

在 DTS 包中使用全局变量


动态属性任务

动态属性任务是通过下列方法来发挥作用的：在包运行时间从数据转换服务 (DTS) 包之外的源检索数值，然后将这些值指派给选中的包属性。通常，由该任务指派的外部值在包运行之前是未知的。因此，包可能需要：

  • 从备份文件获得数据，备份文件的名称根据日期而更改。

  • 连接到可用的服务器上，直到包运行时才能知道该服务器的名称。

  • 在具体的日期范围内，在数据集上运行调度的查询。包必须更新每次执行的日期范围并相应地改变源 SQL 语句。
可用的源类型

动态属性任务可以从下列源中的某一个将外部数据或信息指派给包属性：

  • 诸如 Win.ini 之类的初始化 (*.ini) 文件或希望创建的任何初始化文件。这种选择从长度上只支持单行属性值。

  • 包含可被读取和指派的属性值的数据文件。与初始化文件选择不同，数据文件选择支持多行属性值。

  • 查询。在将查询结果指派给 DTS 包属性时，动态属性任务只使用第一行第一列的结果。为此，应考虑您的查询设计，以便这些查询能够产生单一结果（例如，用于特定名称的 COUNT、SUM 或 SELECT）。

  • DTS 包全局变量。有关更多信息，请参见在 DTS 包中使用全局变量。

  • 环境变量，可包含任何可用的用户变量或系统变量（如 COMPUTERNAME、LOGONSERVER 等）。

  • 常量，通常用来在以前的指派失败时，为属性指派一个默认值。

将 DTS 任务添加到 DTS 包

企业管理器

企业管理器

请参见

DynamicPropertiesTask 对象


执行包任务

执行包任务通过允许您将其它 DTS 包作为工作流的组成部分运行来扩展数据转换服务 (DTS) 的企业功能。在下列情况下这种功能非常有用：

  • 包工作流很复杂，并且可以分割成两个或更多的模块包。例如，如果要装载星型架构，可以构建一系列包，以使不同的包与填充每一维度表及事实数据表相关联。由于个别的包更小且每个包工作流更集中，所以此策略将提高包的可读性并简化调试过程。由于作者可能不需要访问所有包，从而安全级别也得到提高。

  • 可以将工作单元封装在单个包中，并作为事务性组件联接到主包的工作流中。主包运行辅助包，并根据辅助包的成功或失败来提交事务或回滚事务。

  • 其它包可以重新使用包工作流的组成部分。例如，可以构建数据析取模块，可以从不同的包中调用该模块。调用该析取模块的每一个包执行不同的数据清理、筛选或聚合操作。
全局变量与执行包任务

可使用执行包任务动态地从父包到子包为全局变量赋值。子包可处理在它的可执行工作流的任何一个 Microsoft® ActiveX® 脚本中传递给它的全局变量数据。

当把一个很大的工作流分摊给不同的包时，通过全局变量从一个包向另一个包传递信息很有用。例如，一个包负责每夜下载数据、汇总数据、把汇总数据值赋给全局变量，然后把这些值传递给另一个包进一步处理。

根据子包中对全局变量作用域定义的描述处理传递给子包的全局变量值。子包中定义为静态的全局变量保留最后的赋值，未定义为静态的全局变量在脚本运行后返回到初始值。

事务和执行包任务

将执行包任务联接到包事务中可以允许将整个包的执行和其它工作流步骤联接到能够被提交或回滚的工作单元中。将执行包任务联接到事务中之前，请考虑下列情况：

  • 一次只能从一个包中运行一个事务。

  • Microsoft 分布式事务处理协调器 (MS DTC) 必须处于正常工作状态并正在服务器上运行，以确保事务可以工作。此外，MS DTC 客户端必须运行在每台计算机上（在这些计算机上，包为了使事务联接到工作中而运行）。

在其中运行执行包任务的事务性上下文的范围可以是从整个主包的执行上下文到工作流的特定部分，如果该任务没有联接到任何事务中，则范围是从整个主包的执行上下文到执行包任务自身。

将执行包任务联接到 DTS 设计器中的事务时：

  • 使用"DTS 包属性"对话框中的"高级"选项卡，启用包中的事务，并设置诸如隔离级别等常规事务特征。

  • 使用"工作流属性"对话框中的"选项"选项卡，联接与执行包任务相关的步骤与事务。

  • 使用"数据转换属性"对话框中"高级"选项卡中的"插入提交大小"复选框，控制提交事务前移动的数据行数。此选项仅当选定"使用快速装载"复选框时可用。

注意 创建工作流或 ActiveX 脚本时，如果其中的执行包任务被用来调用自身的包，则会造成堆栈溢出并导致 Microsoft 管理控制台 (MMC) 关闭。通常，不推荐在执行包任务中使用递归操作。如果需要递归使用执行包，请确保在 ActiveX 脚本中设置了监视嵌套深度的全局变量（例如，在步骤 ActiveX 脚本中，或在决定优先权的 ActiveX 脚本任务中），并在达到指定的深度之前终止脚本代码中的递归。必须通过 GlobalVariable 集合将全局变量传递给子包。

将 DTS 任务添加到 DTS 包

企业管理器

企业管理器

请参见

设计 DTS 事务

ExecutePackageTask 对象

继承的事务


执行进程任务

使用执行进程任务，可以将可执行程序或批处理文件当作数据转换服务 （DTS） 包的组成部分来运行。尽管可以使用执行进程任务打开诸如 Microsoft® Excel 或 Microsoft Word 之类的任何标准应用程序，但更多的时候，将使用它来运行在数据源上执行的业务应用程序或批处理文件。

例如，可以使用执行进程任务运行自定义的 Microsoft Visual Basic® 应用程序，该应用程序生成日常销售总报告。该包中的其它步骤或任务可以使用销售总报告。然后，可以将该报告当作"发送邮件"任务的附件发送，并将该报告转发给管理分发组。

将 DTS 任务添加到 DTS 包

企业管理器

企业管理器

请参见

CreateProcessTask 对象 (DTS)

CreateProcessTask2 对象 (DTS)


文件传输协议任务

文件传输协议 (FTP) 任务允许作为数据转换服务 (DTS) 包工作流的组成部分，从远程服务器或 Internet 位置下载数据文件。通过包含 FTP 任务，您的 DTS 包可以：

  • 在执行数据移动或转换之前或之后，将目录和数据文件从一个服务器目录位置复制到另一个位置。

  • 登录到源 FTP 位置并将文件或包复制到目的目录。作为将信息发送到数据仓库的进程的一部分，转换的数据或包可以在 FTP 站点上通过 Internet 下载。

  • 根据常规，调度下载不同的文件。通过将 FTP 任务与动态属性任务联合使用，可根据指定的属性（例如，日期或运行时全局变量或环境变量的值），更改将被下载的文件的名称。

说明 如果在使用 FTP 时遇到问题，请在命令提示中使用 ftp.exe 以帮助识别该问题，因为 FTP 任务和 ftp.exe 使用同一连接方法。

将 DTS 任务添加到 DTS 包

企业管理器

企业管理器

请参见

DTSFTPTask 对象


消息队列任务

消息队列任务允许使用消息队列在数据转换服务 (DTS) 包之间发送和接收消息。这些消息可以是简单的文本格式、文件格式或全局变量以及其值。当目标不可用或繁忙时，可以发送消息，例如，从销售代表的膝上型电脑发送到目标或从目标发送到销售代表的膝上型电脑。从而，消息队列任务为您提供了在整个企业异步协调操作的能力。可以：

  • 延迟任务的执行，直到其它包已经提交为止。例如，在每一个零售站点，经过每夜维护之后，消息队列任务向您公司的计算机发送一条消息。在该计算机上运行的包包含了消息队列任务，每一个任务等待来自某个零售站点的消息。当消息到达时，则会触发一个任务以便上载站点数据。只有在所有的站点都提交之后，包才继续计算汇总和。

  • 将数据文件发送到负责处理这些文件的计算机中。例如，餐馆现金登记输出可以用数据文件消息发送给企业薪水系统，例如，侍者小费数据析取。

  • 在整个企业分发文件。例如，一个包可以使用消息队列任务将包文件发送给另一台计算机。然后，在目标计算机上运行的包可以使用消息队列任务检索并在本地保存该包。

  • 将大作业分割成组件，并将它们分配到几台计算机中，使用字符串或全局变量消息协调操作。例如，可以发送包含了包名称的全局变量消息。在另一台计算机上，包使用消息队列任务、动态属性任务以及执行包任务来执行所要求的包。
事务和消息队列任务

Microsoft® SQL Server™ 2000 中，"消息队列"任务不能参与包事务。

有两类消息队列：事务性消息队列和非事务性消息队列。事务性消息队列向给您保证每条消息只传送一次。当使用消息队列任务时，该特性使得事务性队列比起非事务性队列更有可能满足当前或长期的要求。队列的事务性处理状态是在创建表格时设置的，不能进行更改。


安装并配置消息队列

要使用消息队列任务，必须：

  • 在网络上安装消息队列服务器软件。

  • 在计算机上安装消息队列客户端软件。

  • 为您的消息配置队列。

支持两种版本的消息队列：

  • MSMQ。该版本包含在 Microsoft® Windows NT® 4.0 Option Pack 中。

  • Windows® 2000 消息队列。

    除了可以在本地计算机的队列上安装消息队列服务器软件外，还可以在运行 Active Directory™（Windows 2000 中包含的目录服务）的 Windows 2000 域控制器上安装消息队列服务器软件。

    除非在公司的域控制器上安装了消息队列服务器软件，否则无法安装消息队列客户端软件。消息队列客户端软件不作为 Windows 2000 安装程序的一部分安装。

    有关消息队列的更多信息，请参见 Windows 2000 服务器文档。

说明 MSMQ 的安装和配置与消息队列的安装和配置差别很大。


消息类型

消息队列任务发送和接收下列类型的消息：

  • 字符串消息

  • 数据文件消息

  • 全局变量消息
字符串消息

字符串消息包含了文本字符串。若要发送字符串消息，必须指定消息文本。

当配置消息队列任务接收字符串消息时，可以指定筛选标准。可以接受任何字符串消息，或者当只有某个已排列的消息时，可以键入要比较的字符串并且继续执行：

  • 与比较的字符串严格匹配。

  • 与比较的字符串匹配（忽略大小写）。

  • 包含比较的字符串。
数据文件消息

数据文件消息包含数据转换服务 (DTS) 包 ID、版本 ID 以及数据文件的名称和内容。若要发送数据文件消息，必须指定要发送的文件的路径。

在配置消息队列任务以接收数据文件消息时，必须回答下列问题：

  • 该文件是以原始名称保存，还是用指定名称保存？

  • 希望消息队列任务重写现有的文件吗？

  • 接受来自任何源的文件，还是只限于接受从特定包或特定版本发送来的文件？
全局变量消息

全局变量消息包含 DTS 包 ID、版本 ID、名称、类型以及一个或多个变量的值。若要发送全局变量消息，必须将变量添加到包中，并且在配置消息队列任务时指定它们。

配置消息队列任务接收全局变量消息时，可以指定筛选准则。可以接受任意的全局变量消息，或者只有在已排队的消息来自于特定包或包的特定版本时，可以继续执行。


使用消息队列任务发送消息

使用消息队列任务在队列中放置一个或多个消息，以便今后传送到在该计算机或其它计算机上运行的 DTS 包中。

如果出现下列情况，消息队列任务将会在运行时失败：

  • 输入的队列名称不正确或指定的队列不在网络上。

  • 数据文件消息引用了不可用或不存在的数据文件。

  • 消息的大小不能超过 4 MB。

    数据文件和变量必须使用略少于 4 兆字节的大小，以便容纳任何包含的包、版本 ID、文件名称或变量名称以及类型。

重要 不允许消息队列任务参与包事务。因此，如果在消息队列任务的"工作流属性"对话框中选定"有事务时联接"复选框，则包会在运行时失败。

使用消息队列任务发送消息

企业管理器


使用消息队列任务接收消息

在将该消息交付给队列之后，使用消息队列任务检索并处理单个消息。

执行时，消息队列任务扫描队列以查找符合指定筛选准则的第一条消息。如果找到一个这类的消息，消息队列任务会在处理该消息之后成功地终止。如果没有找到这类消息，该任务等待下列事件的第一次发生：

  • 可接收的消息到达。

  • 指定的超时间隔过期了（可选）。

  • 手工取消包的执行。

如果等待产生了可接收的消息，消息队列任务在处理该消息之后成功地终止。否则，它就失败。

收到消息后即可从队列中删除消息。

重要 如果还没有将某条消息（已经被读过）从队列中删除，则在下一次执行该任务时，就会返回同一条消息。队列中的其它可接受的消息仍然处于不可访问的状态，直到第一条消息被删除为止。如果在接收到时不删除消息，则必须另行创建一个消息队列任务。

重要 不允许消息队列任务参与包事务。因此，如果在消息队列任务的"工作流属性"对话框中选定"有事务时联接"复选框，则包会在运行时失败。


接收字符串消息

使用字符串消息响应外部事件的提示。可以继续接收任何字符串消息，或者可以使用筛选准则缩小可接收消息的范围。

使用消息队列任务接收字符串消息

企业管理器


接收数据文件消息

使用数据文件消息将数据文件从一台计算机传输到另一台计算机。数据文件消息包含数据转换服务 (DTS) 包 ID、版本 ID 以及数据文件的名称和内容。

一旦接收到可接受的消息，将保存传送的数据文件，消息队列任务即成功地终止。如果在队列中最初没有可接受的消息，则消息队列任务将一直等到有消息到达为止。如果指定的超时间隔首先过期，则该任务失败。

可将传送的数据文件保存到一个文件或目录位置。如果保存路径中指定了现有的文件，则需要重写文件，否则步骤将失败。

重要 发送数据文件消息的包的任何变化都会生成一个新版本 ID。如果单击"消息队列任务属性"对话框中的"按版本筛选"，则将忽略来自修改过的包的消息。

使用消息队列任务接收数据文件消息

企业管理器


接收全局变量消息

使用全局变量消息将变量以及其值从一个包传输到另一个包。全局变量消息包含了名称、类型以及零值或更多变量。

一旦接收成功，传送的变量及其值都会被添加到 DTSGLobalVariables 集合中，消息队列任务成功结束。以前具有相同名称的现有变量将被替换。可以使用 DTSGlobalVariables("variable name") 从 Microsoft® Visual Basic® Scripting Edition (VBScript) 访问新近传送的变量。

如果在队列中最初没有可接受的消息，则消息队列任务或者一直等到有消息到达为止，或者在指定的超时间隔已经到达后发生失败。

重要 发送全局变量消息的包的任何变化都会生成一个新版本 ID。如果单击"消息队列任务属性"对话框中的"按版本筛选"，则将忽略来自修改过的包的消息。

使用消息队列任务接收全局变量消息

企业管理器


消息队列任务示例

下面的包示例阐明了带有每种消息类型的消息队列任务的使用情况：

  • 准备发货情况包和更新仓库包使用字符串消息协调两台计算机上的操作。

  • 添加新职员包使用全局变量从队列中检索新职员的信息，然后将该信息保存在数据库中。

  • 装载开支包使用数据文件消息，从队列中获得 Microsoft® Excel 工作表，提取开支数据，并将该数据保存在数据库中。


使用字符串消息触发任务

可以使用字符串消息触发其它计算机上的任务，或者在继续执行前等待来自该计算机的信号。

例如，可以在一台计算机上运行联机事务处理系统 (OLTP)。您的数据仓库驻留在另一台计算机上（数据仓库）。每天晚上，在 OLTP 上汇总发货情况，并传输到仓库。但是在进行传输之前，必须更新仓库的维度表。

使用两个包来管理这个进程：更新仓库包和准备发货情况包。

更新仓库运行在仓库计算机上。当启动更新仓库时，请求发货情况发送一个字符串消息，要求 OLTP 计算机开始汇总发货数据。当在 OLTP 计算机上汇总发货数据时，更新维度任务更新仓库的维度数据。当该任务完成时，等待发货情况任务等待来自 OLTP 计算机的字符串消息，该消息表明发货数据已经准备好了。只有在接收到该消息之后，转换数据任务才将发货数据移动到仓库计算机中。

在 OLTP 计算机上运行准备发货情况。等待触发任务初始等待来自请求发货情况任务的字符串消息。一旦接收到，发货汇总任务为传输准备数据。当该数据准备就绪时，警报仓库任务发送消息（"请求发货情况"任务接收到此消息时），通知更新仓库启动传输。

请求发货情况和等待触发形成一个消息队列任务的匹配对。请求发货情况发送消息，而等待触发接收该消息。警报仓库和等待发货情况形成了另一个消息队列任务的匹配对。它们配置的不同之处仅在于消息的文本。

配置请求发货情况任务

请求发货情况将"汇总发货情况"消息发送给队列，该消息在队列中稍后可由等待触发任务读取。

配置请求发货情况任务

企业管理器

企业管理器

配置等待触发任务

运行时，等待触发检查队列中内容为"汇总发货情况"的消息。如果队列中存在这样的消息，等待触发删除该消息，并成功地终止运行。如果没有该消息，此任务将等待，直到有这样的消息到达为止，或者直到该包被取消，而不论哪个条件先满足。

配置等待触发任务

企业管理器


将全局变量消息用于队列数据库更新

添加新职员包使用全局变量消息从队列中获得职员 ID 和名称，并将职员添加到企业数据库中。该包持续添加职员直到该队列为空，此时该包才停止运行。

遵循下列指令创建并运行该包。

创建并配置添加新职员包

必须创建并命名新包。此外，必须设置包属性以便单个的失败不能阻止添加其他新职员。

创建并配置添加新职员包

企业管理器

企业管理器

配置新职员任务

新职员是消息队列任务。当运行时，新职员任务检查全局变量消息。如果队列中有一个全局变量消息，则两个全局变量、ID 和名称被引入该包的上下文中，并且会触发转换数据任务。

配置新职员任务

企业管理器

企业管理器

创建两个数据库连接

该示例处理一个名为 Corporate 的数据库（包含名为 Employee 的表）。Employee 表有两列：EmployeeID 和 EmployeeName。EmployeeID 用做主键。

接收到该消息后，转换数据任务用于将新职员装载到 Employee 表中。转换数据任务要求有两个连接。在这种情况下，因为数据来自全局变量，而不是数据库表，系统将不会使用第一个连接。

将两个数据库连接放在数据转换服务 (DTS) 设计器工作区。将这两个连接都指派给 Corporate 数据库。将第一个连接命名为 Not Used，将第二个连接命名为 Corporate。

说明 此操作也可以通过一个执行 SQL 任务来完成，该任务包含一个 INSERT 语句且该语句的两个输入参数由全局变量值填充。在此情况下，只需一个连接和一个执行 SQL 任务，而无需两个连接和一个转换数据任务。有关更多信息，请参见执行 SQL 任务。

配置转换数据任务

转换数据任务是在接收到全局变量消息之后触发的。它的作业内容是在 Employee 表中插入单行。需要：

  • 从全局变量填充目的列。

  • 保证确实写入了一个目标行。

为全局变量消息配置转换数据任务

企业管理器

企业管理器

配置记录坏的更新任务

记录坏的更新是消息队列任务。在数据库更新失败时会触发该任务。当执行时，它会将失败的 ID 和名称发送到另一个队列用于以后查看。

配置记录坏的更新任务

企业管理器

企业管理器

创建并配置两个循环任务

必须创建两个"循环"任务。（如果设置单个任务遵循"记录坏的更新"和"转换数据任务"，则系统不会运行该任务，这是因为不可能同时满足上述两个引用单元。）通过用动态属性任务访问第一步骤并将其状态更改为等待状态，使包进行循环。两个循环任务之间的唯一差别在于上述任务的标识。

配置一个循环任务

企业管理器

企业管理器

运行包

生成一个将 ID/Name 对发送给队列的包。（将记录坏的更新任务作为模型。）执行这个包。运行添加新职员包。当新职员接收到该消息时，转换数据任务插入该新职员，同时循环任务将控制返回到第一个步骤。包在此时终止。如果将以前存在的职员发送到该队列，则会看到重复键使插入失败，触发了记录坏的更新任务。


使用数据文件消息收集数据

装载开支包使用数据文件消息从队列中提取电子表格，析取开支数据，并将该数据装载到数据库中。

旅行销售组使用标准的 Microsoft® Excel 模板在其膝上型电脑中输入开支。每周，膝上型电脑中的数据转换服务 (DTS) 包将已写明地址的数据文件消息中的完整工作表发送到公司的队列中。当膝上型电脑与网络同步时，该消息就会被传输出去。装载开支包在消息到达时处理这些消息。

遵循这些步骤以便在计算机上创建该包。

创建并配置装载开支包

必须创建并命名新包。此外，必须设置包的属性，以便单个的失败不会关闭该服务。

创建并配置装载开支包

企业管理器

企业管理器

创建三个连接

在处理某个开支报告中，信息会通过三个阶段传递。

  • 当到达时，将开支保存在命名为 C:\Temp\Expense.xls 的 Microsoft Excel 工作表中。该工作表包括名为 Expenses 的范围。该范围的第一行包含了列标题：EmployeeID、ExpenseDate、Expense、Code 以及 Amount。接下来的行包含了各个支出的数据。某些行可能是空的。在表中，开支报告连接会引用到该工作表。

  • 开支首先被装载到名为 RawExpense 的 Corporate 数据库的表中。该表也包括 EmployeeID、ExpenseDate、Expense、Code 以及 Amount 列。对这些条目没有任何限制。在设计表中，原始数据连接被用来引用 RawExpense 表。

  • 然后筛选原始数据并装载到 Corporate 数据库中的 Expense 表中。该表除了包含出现在 RawExpense 中的列，还包含一个名为 ExpenseID 的标识列。它也有限制。特别是，在任何字段中不允许为空。在设计表中，Corporate 连接用来引用 Expense 表。

创建这些数据源并放置连接。创建该电子表格的其它复本以便用做该包的输入。

配置电子表格等待任务

电子表格等待是无限地等待传入数据文件消息的消息队列任务。当该消息到达时，其内容将以 Microsoft Excel 工作表的形式保存在磁盘上，下一个任务将被触发。

配置电子表格等待任务

企业管理器

企业管理器

配置删除原始数据任务

在处理新电子表格之前，最后一个的剩余部分将被删除。删除原始数据任务是一个执行 SQL 任务，执行从 RawExpense 表中删除所有行。

配置删除原始数据任务

企业管理器

企业管理器

配置装载原始数据任务

成功地接收到工作表后，转换数据任务从该电子表格提取行，并将这些行装载到 RawExpense 表中。如果该任务失败，电子表格则被转发到另一个队列中用于以后查看。如果该任务成功了，则会触发另一个转换数据任务来执行最终的装载。装载原始数据任务的配置相对来说很简单。

配置装载原始数据任务

企业管理器

企业管理器

配置装载筛选数据任务

装载了原始数据之后，其它转换数据任务、装载筛选数据将从 RawExpense 中提取行，并将这些行装载到 Expense 表中。如果没有捕获，任何限制违例都会使装载筛选数据任务失败，这样就不会发生更新操作。如果发生这种情况，该电子表格会被转发到另一个队列用于以后查看。如果装载成功，则提交该事务。

配置装载筛选数据任务

企业管理器

企业管理器

配置失败的开支装载任务

当装载失败时，该包必须继续处理其它工作表而不中断。失败的 XLS 装载和失败的开支装载是两种消息队列任务。当电子表格装载失败时，则会触发这两个任务中的某一个以便将有问题的电子表格转发给可以被其它包查看的另一个队列。两个任务提交包事务。这两个任务的配置是相同的，除了它们的描述以及先前的任务。

配置失败的开支装载（或失败的 XLS 装载）任务

企业管理器

企业管理器

创建并配置三个循环任务

必须创建三个循环任务。通过用动态属性任务访问第一步骤并将其状态更改为等待状态，使包进行循环。三个循环任务的唯一差别是先前任务的标识。

创建并配置三个循环任务

企业管理器

企业管理器

运行包

构建另一个将 Expense 工作表复本发送到队列的包。（将失败的开支装载任务作为模型。）执行该包，然后运行装载开支。在接收工作表、装载数据以及将控制返回到第一个步骤（该步骤等待着另一个工作表）时，应该能观察到。如果开支数据不能进行限制检查，也许是因为没有输入项目，会在错误队列中看到发送到那里的电子表格。如果您从其它计算机发送工作表，您可以观察到装载开支的唤醒，然后处理它们。装载开支继续运行直到它被手动地取消，或在删除原始数据或处理消息过程中遇到错误为止。


发送邮件任务

使用发送邮件任务，可以将电子邮件消息当作任务发送。例如，如果希望通知数据库管理员有关备份操作的成功或失败情况，就可以将发送邮件任务与上述的备份任务链接起来。要使用发送邮件任务，必须用 Microsoft® SQL Server™ 实例上的有效用户配置文件安装 MAPI。

发送邮件任务可以包含附加的数据文件。可以指向用于附加文件的位置，并发送动态更新的文件，而不是创建该任务时固定文件的静态复本。这个功能对于发送诸如日志文件和异常错误文件等附件非常有用。

说明 在运行该包时，如果附件文件并不存在，就会收到消息："发送邮件时出错：内部 MAPI 错误：地址簿中没有包含名称的目录"。该消息表明或者在指定的位置不能使用该文件，或者没有授予访问该文件的权限。

将 DTS 任务添加到 DTS 包

企业管理器

企业管理器

请参见

SendMailTask 对象 (DTS)


DTS 转换

本部分描述数据转换服务 (DTS) 可使用的列级转换类型，并解释它们的工作方式。

在使用 DTS 转换之前，需要了解以下事项：

  • 如何映射列转换。有关更多信息，请参见映射列转换。

  • 如何使用所需的转换类型。有关更多信息，请参见转换类型。

DTS 还使您得以使用 DTS 设计器编写 COM 对象形式的自定义转换。有关更多信息，请参见生成 DTS 自定义转换。


映射列转换

在数据转换服务 (DTS) 中，通过使用可用 DTS 转换类型中的某种类型或是通过提供自定义转换，可以将数据从源行集传输到目的表。对于某些转换类型，将复制数据。在其它情况下，当应用转换时修改数据或是根据转换类型规则复制数据。可以按以下方法执行列转换：

  • 在 DTS 设计器中以图形方式转换，用转换数据任务和数据驱动的查询任务。添加到数据包的每个转换数据任务或数据驱动的查询任务都包含一个或多个列转换。

    若要配置转换，请使用"转换数据任务属性"和"数据驱动的查询属性"对话框的"转换"选项卡。此选项卡以图形方式显示源和目的之间进行的所有列映射，它们被用在该任务中。可以使用此选项卡开始配置源列和目的列之间的关系及要使用的特定转换。

  • 使用默认的复制列转换或是在 DTS 导入/导出向导中编写 Microsoft® ActiveX® 脚本。DTS 导入/导出向导只用于这两种转换类型。有关更多信息，请参见在 DTS 中使用 ActiveX 脚本。

    若要修改编写并保存到包（该包在 DTS 导入/导出向导中创建）中的转换脚本，需要在 DTS 设计器中打开该包并编辑与该脚本相关的任务。

  • 以编程方式（使用转换数据任务）表示数据驱动的查询任务或并行数据抽取任务。

    有关更多信息，请参见 Visual Basic 中的 DTS 转换和 Visual Basic 中的 DTS 列对象。

在 DTS 设计器中映射转换

可以在 DTS 设计器中映射转换以便在源列和目的列之间建立关系。映射配置可以有多种类型：

  • 一对一映射，它包含单个源列和单个目的列。

  • N 对 N 映射，它包含相同数量的多个源列和目的列。

  • 映射数量不等的源列和目的列。

DTS 使您得以通过对实现 IDTSDataPumpTransform 接口的对象进行编程，创建自己的自定义转换（每个都有各自的列要求）。对这些转换的映射可以是以上分类之一，也可以有不同的要求。

有关更多信息，请参见生成 DTS 自定义转换和 IDTSDataPumpTransform (DTS)。

一对一列映射

当转换需要一个源列和一个目的列时，应使用一对一列映射。默认情况下，DTS 设计器使用此配置在转换数据任务中映射每个源列和目的列，同时尝试按名称匹配每个源列和目的列（例如，源列中的 CategoryName 将映射到目的列中的 CategoryName，依此类推）。以下是和一对一列映射一起使用的转换类型：

  • 复制列转换

  • 剪裁字符串转换

  • 日期时间字符串转换

  • 字符串中间部分转换

  • 读取文件转换

  • ActiveX 脚本转换

一对一列映射转换用指示数据流方向的单个连接箭头显示。以下关系图（在"转换数据任务属性"对话框的"转换"选项卡中）显示了四个这样的转换（粗箭头表示已经选定了其中的一个转换）。

N 对 N 列映射

使用 N 对 N 列映射的转换要求多个源列和目的列的数量相匹配。当每个源列都必须有对应的目的列时请使用这种映射，并且一起配置所有的转换（如同单个数据抽取操作）要比单独调用每一行的单个转换效率要高。默认情况下，数据驱动的查询任务将使用这种类型的映射配置。

N 对 N 列映射包括以下转换类型：

  • 复制列转换

  • 大写字符串转换

  • 小写字符串转换

  • ActiveX 脚本转换

N 对 N 列映射用在每一端连接相同数量分支的单个箭头显示。以下关系图显示了这种转换的映射，该映射连接了四个源列和四个目的列：

如果编辑复制列转换以便将相同的源列复制到多个目的列，则应更改映射以指出数据流，同时涉及源表和目的表的映射行的数量将不相等。这种映射类型表明单个源列正在被复制到多个目的列。

说明 单个多对多复制列转换比多个一对一复制列转换的速度快。有关更多信息，请参见 增强 DTS 包的性能。

映射不同数量的源列和目的列

转换映射可以包括不同数量的源列和目的列。例如：

  • 源列多于目的列

  • 目的列多于源列

  • 无源列或目的列

以下是这些类型映射的几个示例。

一个或多个源列和无目的列

可以进行只处理来自源表的值的 ActiveX 脚本转换。在下例中（用 Microsoft Visual Basic® Scripting Edition (VBScript) 编写），将检查 CategoryName 列的每一行（来自 Northwind 示例数据库的 Categories 表）中是否存在 NULL 值或空字符串。如果行中没有这些值，则将给包全局变量赋以 CategoryName 值。

以下是这种映射类型的示例 ActiveX 转换脚本：

Function Main()
   If Not IsNull (DTSSource("CategoryName")) Then
      If LEN(DTSSource("CategoryName")) > 0 Then
         DTSGlobalVariables("gv2") = DTSSource("CategoryName")
      End If
   End If
   Main = DTSTransformStat_OK
End Function

虽然此示例仅使用一个源列，但也可以使用多个源列和无目的列来创建 ActiveX 脚本转换。

两个源列和无目的列

写入文件列转换是有特殊映射要求的转换的示例。转换的数据来源于一个源列，并将其写入某个文件。它的文件名在第二个源列中。因此，它需要两个源列（一列包含要复制的数据，另一列包含文件名称列表）和零个目的列。

在以下关系图中，写入文件列转换来自源表并且不涉及任何目的列。

一个或多个目的列和无源列

可以进行只处理来自目的表的值的 ActiveX 脚本转换。在下例中，将一个增量计数器值追加到两个全局变量值中，并且将串联的字符串指派给 Categories 表的 CategoryName 列和 Description 列。

以下是这种映射类型的示例 ActiveX 转换脚本：

Dim N

Function Main()

   If IsEmpty(N) Then
      N = 0
   End If

   DTSDestination("CategoryName") = DTSGlobalVariables("gv1") & (N)
   DTSDestination("Description") = DTSGlobalVariables("gv2") & (N)
   N = N + 1
Main = DTSTransformStat_OK

End Function
无目的列和无源列

有时候 ActiveX 脚本转换可能不引用任何源列或目的列。例如，脚本可能仅包含对全局变量、查找查询，或者诸如通知这样的操作的处理。

以下是这种映射类型的示例 ActiveX 转换脚本。在下面的脚本中，源列中每一行数据的全局变量值都是增加的：

Dim counter

Function Main()
   Counter = counter + 1
   DTSGlobalVariables("gv1").Value = DTSGlobalVariables("gv1") + 1
   Main = DTSTransformStat_SkipInsert
End Function

以下脚本可用于在所需的项目已装载到转换中之后跳过进一步的插入：

Function Main()
   If DTSGlobalVariables("LoadComplete").Value  = True Then
      Main = DTSTransformStat_SkipRow
   Else
      Main = DTSTransformStat_OK
   End if
End Function

请参见

数据驱动的查询任务

ParallelDataPump 任务对象

转换数据任务

在 DTS 包中使用全局变量


转换类型

本部分描述数据转换服务 (DTS) 中可用的各个列级转换。

主题 | 描述
复制列转换 | 描述用于将源数据复制到目的的转换。
ActiveX 脚本转换 | 解释如何使用 Microsoft ActiveX® 脚本定义列级转换。
日期时间字符串转换 | 描述用于将源日期转换为新目的格式的转换。
大写字符串转换 | 描述用于将字符串转换为大写字符的转换。
小写字符串转换 | 描述用于将字符串转换为小写字符的转换。
字符串中间部分转换 | 描述用于从源列中提取子字符串的转换，并且还可以在将结果放到目的列之前更改它的大小写或剪裁空格。
剪裁字符串转换 | 描述用于删除源字符串的起始空格、尾随空格或嵌入空格的转换，并将结果放在目的列中（可以进行大小写转换）。
读取文件转换 | 描述用来将源列所指定的文件内容复制到目的列的转换。
写入文件转换 | 描述这样的转换，它为每个在源列中命名的文件创建新数据文件，并且用第二个源列中的数据初始化每个文件的内容。


复制列转换

不使用 Microsoft® ActiveX® 脚本或任何应用到数据的其它转换，复制列转换即可直接将数据从源列复制到目的列。这样复制数据时，应该考虑以下事项：

  • 指定列。可以指定从单个源列到单个目的列，或是从多个源列到多个目的列的复制列转换。

  • 进行转换。可以使用转换标志强制转换允许的数据类型转换。在数据转换服务 (DTS) 设计器中创建或编辑转换时或进行编程时，可以使用这些转换标志。默认情况下，DTS 允许源列和目的列之间所有可能的转换。

    有关更多信息，请参见 DTSTransformFlags。

  • 截断问题。复制列转换截断文本时不会出现错误或提示。尽管可以设置转换标志以避免可能发生的截断，但是没有办法在必须截断的第一行停止转换。

  • 更改复本中的列。当使用复制列转换以复制多个源列和目的列时，可以将同一列复制到多个目的列。

请参见

DataPumpTransformCopy 对象 (DTS)


ActiveX 脚本转换

当数据从源移动到目的时，可以使用 Microsoft® ActiveX® 脚本修改数据。可以在一个或多个源和目的列间编写转换代码。

可以在数据转换服务 (DTS) 用户界面中的多个位置编写 ActiveX 转换脚本。但是，ActiveX 脚本转换应用在对源数据逐行进行处理的任务上。该脚本用于：

  • DTS 导入/导出向导。

  • 数据驱动的查询任务。

  • 转换数据任务。

在以上项目中，将对每个来自源的数据行执行转换脚本。

说明 因为将对每行数据执行 ActiveX 脚本转换，所以在设置打开和关闭连接的代码时应使每次处理一行数据时不打开和关闭新的连接。

有关使用 ActiveX 脚本或代码示例的更多信息，请参见在 DTS 中使用 ActiveX 脚本。

请参见

ActiveX 脚本任务

转换数据任务

数据驱动的查询任务


日期时间字符串转换

日期时间字符串转换将源列中的日期或时间转换为目的列中的另一种格式。

进行转换需要两步：

  1. 将源列中的每一项都转换为 OLE DB DBTYPE_TIMESTAMP 数据类型。如果源列是字符串类型，则源日期时间格式字符串支配转换。

  2. 将 OLE DB DBTYPE_TIMESTAMP 数据类型转换为目的列格式。如果目的列是字符串类型，则使用目的列日期格式字符串格式化所得到的文本。

如果源列或目的列不是字符串类型，则忽略相应的格式字符串。

下列是可用的标准日期格式字符串：

  • dd MMM yy

  • dd MMMM yy HHmm

  • dd MMMM yy HHmmss.ff

  • dddd MM/dd/yy hh:mm tt

  • dddd, MMMM dd,yyyy hh:mm:ss.ffff tt

  • hh:mmtt

如果您的日期格式字符串不是上述标准格式，可使用下列任何标记创建自己的日期格式字符串：

值 | 标记
年 | yyyy, yy
月 | MMMM, MMM, MM, M
日 | dddd, ddd, dd, d
12 小时 | hh, h
24 小时 | HH, H
分钟 | mm, m
秒 | ss, s
分数 | f（可重复）
上午/下午 | Tt

此外，还可以指定：

  • 月份的全称和缩写。

  • 周中每日的全称和缩写。

  • 显示日期所用的语言。

说明 所有转换都使用运行包的 Microsoft® SQL Server™ 实例上的当前区域设置。

如果格式化结果过大而无法全部放入字符串类型的目的列中，则将被截断。

如果是下列情况，则日期时间字符串转换将失败：

  • 源列或目的列不是字符串或日期类型。

  • 指定了无效的日期格式字符串，例如"mm/dd/mm"。

  • 源字符串与源日期格式字符串不匹配。

转换日期时间字符串转换的格式

企业管理器

企业管理器

请参见

DataPumpTransformDateTimeString 对象

日期时间字符串转换属性

DTS 转换


小写字符串转换

小写字符串转换将源列转换为小写字符，并且如有必要，转换为目的列数据类型。源列和目的列都必须是字符串数据类型。在单个转换中可处理多个源列。

如果源数据过大而无法全部放入目的列中，则将被截断。有关更多信息，请参见复制列转换。

小写字符串转换是 N 对 N 转换映射的示例。只要提供给每一源列相匹配的目的列，即可选定任意数目的源列。有关更多信息，请参见映射列转换。

将字符串转换为小写字符

企业管理器

企业管理器

请参见

列顺序

DataPumpTransformLowerString 对象

DTS 转换


大写字符串转换

大写字符串转换将源列转换为所有大写字符，并且如有必要，转换为目的列数据类型。源列和目的列都必须是字符串数据类型。在单个转换中可处理多个源列。

如果源数据过大而无法全部放入目的列中，则将被截断。

大写字符串转换是 N 对 N 转换映射的示例。只要每一源列与目的列相匹配，即可选定任意数目的源列。有关更多信息，请参见映射列转换。

将字符串转换为大写字符

企业管理器

企业管理器

请参见

列顺序

DTS 转换

DataPumpTransformUpperString 对象


字符串中间部分转换

字符串中间部分转换从源列析取子字符串，将其转换，然后将结果复制到目的列。

通过提供起始位置和所要包含的最多字符个数来指定子字符串。请考虑下列事项：

  • 字符串中的第一个字符占用位置 1。

  • 如果没有指定最多的字符个数，则占用的位置大于或等于起始位置的所有字符都包含在子字符串中。

  • 如果起始位置超过了字符串的末尾，则所得到的为空字符串。

通过使用下列选项，可进一步处理所得到的子字符串：

  • 剪裁选项，包括删除起始空格、尾随空格或嵌入空格。

    空格由下列字符组成：制表符、换行符、垂直制表符、换页符、回车和空格 (0x09 – 0x0D、0x20) 以及它们相应的 Unicode。

  • 大小写选项，包括将子字符串转换为大写字符或小写字符。

如果最终结果过大而无法全部放入目的列中，则将被截断。

如果源列或目的列不是字符串数据类型，则字符串中间部分转换将失败。

执行字符串中间部分转换

企业管理器

企业管理器

请参见

DataPumpTransformMidString 对象

字符串中间部分转换属性

DTS 转换


剪裁字符串转换

剪裁字符串转换从源列中的字符串删除起始、尾随和嵌入空格，并将结果复制到目的列。

空格由下列字符组成：制表符、换行符、垂直制表符、换页符、回车和空格 (0x09 – 0x0D、0x20) 以及它们相应的 Unicode。

可有选择地将剪裁的字符串转换为大写字符或小写字符。

如果剪裁的源列数据过大而无法全部放入目的列中，则将被截断。

如果源列或目的列不是字符串数据类型，则剪裁字符串转换将失败。

执行剪裁字符串转换

企业管理器

企业管理器

请参见

DTS 转换

DataPumpTransformTrimString 对象

剪裁字符串转换属性


读取文件转换

读取文件转换定位并打开名称由源列指定的文件的内容，并将该内容复制到目的列中。

当配置转换时，定义包含源列中列出的文件的路径。所有文件必须在同一目录路径中。

说明 目录名可以磁盘驱动器或通用命名规则 (UNC) 开始。

如果在路径中找不到文件，则可以：

  • 使目的列为空。

    或

  • 使任务失败。

如果是下列情况，读取文件转换将失败：

  • 选定的是"没有找到文件时显示错误信息"复选框且路径与现有文件不匹配。

  • 源列不是字符串类型。

  • 目的列不是字符串或二进制类型。

  • 该进程没有读取该文件的权限。

  • 在源列中出现无效文件名字符。

  • 读取路径指定了不存在的文件夹中的位置。
转换文件内容

如果目的列是字符串类型，则根据文件类型（例如，ANSI、OEM 或 Unicode）解释文件内容。将在运行包的 Microsoft® SQL Server™ 实例上使用当前代码页执行转换。如果目的列是二进制或图像类型，则不发生转换。

执行读取文件转换

企业管理器

企业管理器

请参见

DataPumpTransformReadFile 对象

读取文件转换属性

DTS 转换


写入文件转换

写入文件转换将源列（数据列）的内容复制到路径由第二个源列（文件名列）指定的文件中。

当配置转换时，定义包含文件名列所列出的文件的路径。所有文件必须在同一目录路径中。如果在路径中找不到文件，则创建一个文件并使用数据列的内容初始化该文件。

说明 目录名可以磁盘驱动器或通用命名规则 (UNC) 开始。

如果已经存在同名的文件，则转换执行下列操作之一：

  • 替换现有文件。

  • 将数据列的内容追加到现有文件。

  • 使执行步骤失败。

在配置写入文件转换之前，请考虑下列事项：

  • 尽管可能或不能将内容复制到目的列，但是必须指定目的连接。

  • 如果数据列的内容为空，则转换会删除由保存路径指定的文件。但是，如果选择了"有文件存在时追加"复选框，则不删除文件。

如果是下列情况，写入文件转换将失败：

  • 保存路径与现有文件匹配且没有选择"有文件存在时重写"复选框。

  • "文件名列"复选框中的值不是字符串类型。

  • 数据列不是字符串或二进制类型。

  • 该进程没有写入指定目录或重写现有文件的权限。

  • "文件名列"复选框中的内容为 NULL 或长度为零。

  • "文件名列"复选框中出现无效的文件名字符。

  • 保存路径指定了不存在的文件夹中的位置。

执行写入文件转换

企业管理器

企业管理器

请参见

DTS 转换

DataPumpTransformWriteFile 对象

写入文件转换属性


DTS 连接

要成功执行复制和转换数据的数据转换服务 (DTS) 任务，DTS 包必须与其源数据和目的数据以及所有其它数据源（如查找表）建立有效的连接。

因为 DTS 的 OLE DB 体系结构，DTS 允许与以各种 OLE DB 兼容格式存储的数据建立连接。此外，如果 OLE DB 提供程序可以用于这些数据源，并且使用 Microsoft® 数据链接文件配置这些连接，则 DTS 包通常可以连接到自定义格式或非标准格式的数据。

DTS 允许下列各种连接：

  • 数据源连接。

    包括连接到：标准数据库（如 Microsoft® SQL Server™ 2000、Microsoft Access 2000、Oracle、dBase、Paradox）；与 ODBC 数据源的 OLE DB 连接；Microsoft Excel 2000 电子表格数据；HTML 源；以及其它 OLE DB 提供程序。

  • 文件连接。

    DTS 对文本文件提供额外的支持。指定文本文件连接时，需要指定文件的格式。例如：

    • 文本文件是分隔字段格式还是固定字段格式。

    • 文本文件是 Unicode 格式还是 ANSI 格式。

    • 行分隔符和列分隔符（如果文本文件是固定字段格式）。

    • 文本限定符。

    • 第一行是否包含列名。
  • 数据链接连接。

    在这些连接中，SQL Server 外部的中间文件存储连接字符串。

配置连接

在 DTS 导入/导出向导、DTS 设计器中或通过编程方式创建包时，可以通过从可用的 OLE DB 提供程序列表中选择一种连接类型来配置连接。为每个连接配置的属性依数据源的各个提供程序而有所不同。

可以配置新的连接或使用现有的连接。可以在一个包中多次使用同一连接。

在配置连接之前，请注意以下事项：

  • 在同一时刻，每个连接只能由一个 DTS 任务使用，因为连接是单线程的。如果设计的包需要多个任务连接，请考虑打开多个连接并且平衡负荷以便提高性能。

  • 如果两个任务使用同一连接，则强迫这两个任务顺序执行，而不是并行执行。如果两个任务使用不同的连接，那么这两个任务可以并行执行。如果两个任务使用单独的连接，但是这些连接引用同一个 SQL Server 实例，那么这两个任务将并行执行。如果这两个任务已联接包事务，该包将失败。

    有关更多信息，请参见 DTS 事务基础知识。

  • 如果计划在不同的服务器上运行包，则可能需要编辑包中建立的直接连接（例如，如果原始数据源将不可用，或者您要连接到不同的数据源）。要简化编辑操作，可以考虑使用数据链接文件，其中连接字符串被保存在单独的文本文件中。或者，可以考虑使用动态属性任务在运行时更改连接信息。

  • 在调度包时，应该考虑您提供的安全性信息。如果配置连接时使用了 Windows 身份验证，那么将使用 SQL Server 代理授权信息建立连接，而不是使用设计包时所用的帐户信息。有关更多信息，请参见在 DTS 中处理包安全性。

创建连接

企业管理器

企业管理器

编辑连接

只有在 DTS 设计器中或通过编程方式，才可以编辑现有包中的现有连接。

如果在 DTS 设计器中编辑包并更改连接属性，DTS 设计器会尝试连接您指定的服务器。如果当前该服务器不可用，则 DTS 设计器不允许通过"连接属性"对话框更改连接属性。然而，有时您可能希望避开这种安全机制（例如，如果您正在配置或编辑要在不同的 SQL Server 实例上运行的包）。在这些情况下，使用脱接编辑功能直接编辑包属性。有关更多信息，请参见用脱接编辑来编辑 DTS 包属性。

在执行包时，DTS 仅在使用连接时才建立连接。DTS 不会预先验证连接。默认情况下，连接在使用后仍然打开，以备反复使用。因为不检查连接，所以可以在建立实际连接之前使用 Microsoft ActiveX® 脚本动态地设置连接属性（例如，通过选择某台服务器）。

如果在两个连接之间定义了转换，而您需要更改源连接或目的连接，则转换可能不再有效。因此，DTS 设计器提示您是否将转换属性重置为默认值。如果决定重置转换，每个与该连接关联的转换的属性均将被删除。然而，查找不会受影响。

请参见

Visual Basic 中的 DTS 连接


数据链接连接

在 Microsoft® SQL Server™ 2000 中，数据转换服务 (DTS) 包可以使用 Microsoft 数据链接 (.udl) 文件创建 OLE DB 连接，并在运行时解析该连接。该功能使您可以将连接属性从 DTS 包压缩到单独的文件中。如果连接信息（例如服务器名、登录,甚至是 OLE DB 提供程序）可能会改变，则在这种情况下，可以编辑数据链接文件中的连接字符串，而不是编辑 DTS 包中的连接属性。

在 Microsoft SQL Server 7.0 版中可以使用数据链接文件，但是连接在运行时不被解析并只能通过编辑 DTS 包进行修改。在 OLE DB 提供程序有特殊连接要求（该要求只能通过数据链接对话框进行寻址）的情况下，这种方法非常有用。

如果要指定数据链接连接，则必须首先指定是加载现有数据链接文件，还是创建数据链接以便用 DTS 设计器保存。

如果要使用数据链接文件而不是使用 DTS 设计器保存数据链接，则可以从 Windows 资源管理器或者在 DTS 设计器中的数据链接配置进程期间创建数据链接文件。

用运行时解析创建数据链接文件

企业管理器


DTS 包工作流

数据转换服务 (DTS) 中的步骤和优先顺序约束确定 DTS 包中的工作项顺序。可以通过 DTS 设计器以图形方式或通过编程方式设计 DTS 包工作流。有关更多信息，请参见创建 DTS 包工作流和任务。

也可以使用 Microsoft® ActiveX® 脚本自定义步骤执行。有关更多信息，请参见在 DTS 工作流中使用 ActiveX 脚本。

DTS 包步骤

使用步骤控制任务在 DTS 包中的执行顺序。步骤代表 DTS 对象模型中的执行单元，并且，它们还定义包运行时执行哪些任务和按什么顺序执行。

在 DTS 设计器中，不需要直接操作步骤。而是在 DTS 设计器设计表上操作任务并使用优先顺序约束以控制执行任务的顺序。当在设计表上放置一个任务时，一个步骤将自动添加到包中，使步骤能够引用任务。

通过编程创建一个包时，可以更精确地控制步骤和任务之间的关系。可以为不同的包操作创建多个步骤，并将这些步骤的执行与单个任务关联。例如，假设在 Microsoft Visual Basic® 中编写一个包，并指定了包中可能产生错误的几个部分。通过将步骤与这些错误关联，可以使不同类型的错误执行相同的发送邮件任务。该发送邮件任务可以发送电子邮件通知数据库管理员 (DBA) 包已失败。

DTS 设计器使您得以执行一个单独的包步骤。对于不运行整个包而测试和排除单独步骤的故障时，这个操作将很有用。

在 DTS 设计器中执行单个包步骤

企业管理器

企业管理器

优先顺序约束

优先顺序约束按顺序链接包中的任务。在 DTS 中，可以使用三种类型的优先顺序约束，这些约束可以通过 DTS 设计器或编程方式来访问：

  • 无条件。

    如果要任务 2 一直等到任务 1 完成而不管结果如何，可以使用无条件的优先顺序约束将任务 1 链接到任务 2。

  • 成功时。

    如果要任务 2 一直等到任务 1 成功完成，则可以使用成功优先顺序约束将任务 1 链接到任务 2。

  • 失败时。

    如果要任务 2 仅在任务 1 未能成功执行时才开始执行，则可以使用失败优先顺序约束将任务 1 链接到任务 2。如果要在遇到错误时运行工作流的选择性分支，可以使用这个约束。

下列关系图阐述了 DTS 设计器中步骤和任务之间的关系，同时显示优先顺序约束是如何确定步骤执行的。

步骤 1、步骤 2 和步骤 3 指出包步骤出现的位置。在包打开和所有连接建立之后，执行的流程如下所示：

  • 步骤 1：执行 SQL 任务除去并重新创建目的表。

  • 步骤 2：如果成功除去并重新创建了目的表，则数据从 Microsoft Access 数据库表复制到 Microsoft SQL Server™ 数据库表。"成功时"优先顺序约束显示为一个从执行 SQL 任务指向转换的绿色条带箭头，该约束在两个步骤之间建立关系。转换数据任务以一个从 Microsoft Access 数据库指向 SQL Server 数据库的黑灰色箭头显示。

    因为连接放置在设计表上转换数据任务箭头的两端，所以，两个优先顺序约束实际上接触连接图标而不是转换数据任务本身。在步骤 2 中，这些图标代表连接而非任务。转换数据任务以黑灰色线表示，是唯一由线而不是图标表示 DTS 设计器的任务。对于 DTS 设计器中的所有其它任务，连接优先顺序约束到任务图表本身而不是连接图标。

  • 步骤 3：如果数据复制任务失败，将发送一封电子邮件通知到 DBA。从转换指向发送邮件任务的失败优先顺序约束在这两个步骤之间建立关系。
使用多个优先顺序约束

可以在一个任务上发布多个优先顺序约束。例如，在下列说明中，任务 C 可能有一个来自任务 A 的成功约束和一个来自任务 B 的失败约束。在这种情况下，DTS 假设一个逻辑"与"关系。因此，如果任务 C 要开始执行，则任务 A 必须成功地执行而任务 B 必须失败。


在 DTS 工作流中使用 ActiveX 脚本

可以使用 Microsoft® ActiveX® 脚本自定义数据转换服务 (DTS) 包中的步骤执行。因为代码在步骤执行之前运行，可以在工作流中使用 ActiveX 脚本：

  • 重新启动工作流。

  • 在某些条件下关闭步骤。

  • 开始连接和其它操作的重试。

  • 执行循环条件。

也可以使用一个步骤 ActiveX 脚本初始化或引用全局变量。有关更多信息，请参见在 DTS 包中使用全局变量。

在 DTS 设计器中添加 ActiveX 工作流脚本

企业管理器

企业管理器

以下示例显示如何在 DTS 设计器中实现 ActiveX 工作流脚本。也可以编程添加工作流 ActiveX 脚本。有关更多信息，请参见添加 DTS ActiveX 脚本。

打开步骤和关闭步骤

以下示例用 Microsoft Visual Basic® Scripting Edition (VBScript) 编写，其中使用了一个 ActiveX 脚本，根据文件是否存在来打开或关闭步骤：

Function Main()

      Dim fso 'File system object
      Set fso = CreateObject("Scripting.FileSystemObject")
      IF (fso.FileExists("C:\temp\download.tmp")) THEN
         Main = DTSStepScriptResult_ExecuteTask
      ELSE
         Main = DTSStepScriptResult_DontExecuteTask
      END IF

End Function
重试

以下示例用 VBScript 写成，在终止步骤之前五次检查文件是否存在。全局变量 retries 存储尝试进行的文件检查次数：

Function Main()

      Dim fso
      Set fso = CreateObject("Scripting.FileSystemObject")
      IF NOT(fso.FileExists("C:\MyFile.txt")) THEN
         DTSGlobalVariables("retries").Value  =
               DTSGlobalVariables("retries").Value  + 1
         IF DTSGlobalVariables("retries").Value > 5 THEN
            Main = DTSStepScriptResult_DontExecuteTask
         ELSE
            MsgBox "Retry #" &  DTSGlobalVariables("retries").Value
            Main = DTSStepScriptResult_RetryLater
         END IF
      ELSE
         Main = DTSStepScriptResult_ExecuteTask
      END IF

End Function
执行循环条件

下列 ActiveX 脚本步骤代码示例是用 VBScript 编写的，指派给通过优先顺序约束连接的两步骤工作流中的第二个步骤（步骤 1 -> 完成时优先顺序约束 -> 步骤 2）。

与步骤 2 相关联的 ActiveX 脚本作为一个循环。脚本操作如下：

  1. 创建全局变量 counter（默认情况下初始化为 0），每次执行步骤 2 时递增该变量。

  2. 前四次执行步骤 2 时，会显示包含 counter 值的信息框，而上一步的执行状态设置为等待，这将导致重新启动与步骤 1 相关联的任务。不执行与步骤 2 相关联的任务。

  3. 当 counter 值达到 5 时，与步骤 2 相关联的任务运行，并且包完成执行。
Function Main()

   Dim oPkg
      DTSGlobalVariables("counter").Value = _
      DTSGlobalVariables("counter").Value + 1

      If DTSGlobalVariables("counter").Value < 5 THEN
         Msgbox DTSGlobalVariables("counter").Value
         Set oPkg = DTSGlobalVariables.Parent

         'Set previous step status to waiting.
         oPkg.Steps("DTSStep_DTSActiveScriptTask_1").ExecutionStatus = _
            DTSStepExecStat_Waiting

         'Do not execute task 2, step 1 will restart.
         Main = DTSStepScriptResult_DontExecuteTask

      Else
         'Execute task 2, do not restart step 1.
         Main = DTSStepScriptResult_ExecuteTask
      END IF

End Function

请参见

DTSStepScriptResult

在 DTS 中使用 ActiveX 脚本


管理 DTS 包

可以从 SQL Server 企业管理器以及从 DTS 工具中管理数据转换服务 (DTS) 包。下面的主题描述包管理的各个方面。

主题 | 描述
创建 DTS 包 | 解释创建 DTS 包的不同方法。
编辑 DTS 包 | 描述如何修改现有的包。
删除 DTS 包 | 描述删除某个包和包的各个版本的不同方法。
执行 DTS 包 | 解释运行包的不同方法。
保存 DTS 包 | 描述保存包时所使用的不同格式。
使用 DTS 包日志 | 描述包日志中包含的信息。
管理 DTS 包属性 | 描述查看、配置和编辑包属性的不同方法。
在 DTS 中处理包安全性 | 讨论有关包的安全性问题以及提高包安全性的方法。

也可以通过编程方式保存及执行包。有关更多信息，请参见管理用 Visual Basic 编写的 DTS 包程序。


创建 DTS 包

通过使用 Microsoft® SQL Server™ 2000 附带的工具或者编制 DTS 对象模型程序，可以创建数据转换服务 (DTS) 包。

包的构造方法 | 描述 | 推荐的用法
DTS 导入/导出向导 | 一个简单易用的工具，它指导您分步骤通过创建 DTS 包的整个进程。 | 适用于简单的数据转换或数据移动解决方案（例如将表格格式数据导入到 SQL Server 2000 数据库）。
DTS 设计器 | 一个应用程序，它使用图形对象帮助构造包含复杂工作流的包。 DTS 设计器包含一套模型化的 DTS 包模板，每一个模板都专为某个特定解决方案而设计，可以为自己的安装复制和自定义这些模板。 | 适用于复杂的数据转换解决方案，这些方案需要多个连接、复杂的工作流以及事件驱动的逻辑。 DTS 包模板适用于某些新用户，这些新用户正在学习有关 DTS 设计器的知识；也适用于一些较有经验的用户，这些用户要建立特殊的 DTS 功能（例如，数据驱动的查询）。
DTS 应用程序设计 | 编制可使用 Microsoft Visual Basic® 或 Microsoft Visual C++® 编写或编译 DTS 包的应用程序。 | 适用于某些开发人员，他们想直接访问 DTS 对象模型，并且想对包操作施加更为细微的控制。 可以在 DTS 设计器中打开通过编程创建的包，并且可以进一步对其自定义。此外，可以将 DTS 导入/导出向导或 DTS 设计器中创建的包另存为 Visual Basic 程序，然后在开发环境（例如 Microsoft Visual Studio®）中将其打开并进一步进行自定义。

在 SQL Server 2000 的实例上创建的 DTS 包不能装载到或运行于 SQL Server 7.0 版或更早版本的实例上。有关更多信息，请参见 SQL Server 向后兼容性详细信息。

使用 DTS 导入/导出向导创建 DTS 包

向导

向导

使用 DTS 设计器创建 DTS 包

企业管理器

企业管理器

访问 DTS 包模板

企业管理器

企业管理器

请参见

使用 DTS 设计器创建包

使用 DTS 导入/导出向导创建包

用 Visual Basic 创建 DTS 包


编辑 DTS 包

编辑数据转换服务 (DTS) 包时，修改或进一步自定义先前保存的包。例如，可以创建一个包，将数据从 Oracle 服务器复制到 Microsoft® SQL Server™ 2000 的一个实例上。然后，可以添加一个任务以便在复制操作完成时发送电子邮件。

编辑包的方法包括：

  • 使用 DTS 设计器。

    说明 不能使用 DTS 导入/导出向导编辑包。

  • 如果已通过 DTS 设计器或 DTS 导入/导出向导创建了包并将其另存为 Visual Basic 文件，则使用 Microsoft Visual Basic® 开发环境。

  • 如果已在 Microsoft Visual Basic 或 Microsoft Visual C++® 模块中创建了包并将其另存为 Visual Basic 或 Visual C++ 项目，则使用 Microsoft Visual Studio® 开发环境。在大多数情况下，将这几种包保存好之后，就可以在 DTS 设计器中将这些包打开以便进行编辑。

若要编辑包，必须有打开该包的授权。如果某个包用所有者密码保存了，而您不能访问该密码，那么就不能编辑该包。如果设置了用户密码，而可以访问该密码，那么就可以执行该包但并不能编辑该包。

如果将包保存到 SQL Server 2000 Meta Data Services，那么就可以设置 DTS 包密码保护。在这种情况下，需要通过 Windows 身份验证或 SQL Server 身份验证来处理安全性。有关更多信息，请参见在 DTS 中处理包安全性。

编辑保存到结构化存储文件的 DTS 包

企业管理器

企业管理器

编辑保存到 SQL Server 或 Meta Data Services 的 DTS 包

企业管理器


删除 DTS 包

可以删除任何数据转换服务 (DTS) 包。所使用的方法依赖于保存包时所使用的格式。例如：

  • 如果包保存到 Microsoft® SQL Server™ 或 SQL Server 2000 Meta Data Services，则可以通过 SQL Server 企业管理器将其删除。

  • 如果您是包的创建者或是 sysadmin 固定服务器角色成员，则只能删除保存到 SQL Server 2000 或 Meta Data Services 的包。如果包保存到结构化存储文件或 Microsoft Visual Basic® 文件，则通过文件管理器将其删除。
删除包版本

为了删除包版本，需要考虑保存包时所采用的格式。例如：

  • 如果将包保存到 SQL Server，那么就可以删除任何包版本。

  • 如果将包保存到 Meta Data Services，那么就只能删除最新的包版本。

  • 如果将包保存到结构化存储文件，那么就必须删除整个文件。不能删除保存到文件中的个别的包或包版本。

保存到 Visual Basic 文件的包不包含版本信息。

删除 DTS 包

企业管理器


执行 DTS 包

当运行数据转换服务 (DTS) 包时，包的所有连接、任务、转换及脚本代码都按照包工作流描述的顺序执行。

可以从下列工具执行包：

  • 在 DTS 工具内。

  • SQL Server 企业管理器。

  • 包执行实用工具。
从 DTS 工具执行包

在创建或编辑包之后，可以在 DTS 设计器中执行包；或者在创建包之后，在 DTS 导入/导出向导中执行包。

当在 DTS 设计器或 DTS 导入/导出向导中运行包时，就会显示执行进程的汇总状态以及包中所有步骤的执行状态。可以检查每一步骤的状态，并且对于没有成功执行的步骤，收集其相关的信息。

说明 当使用 DTS 运行实用工具时，也可以查看步骤执行的状态。

从 DTS 设计器执行 DTS 包

企业管理器

企业管理器

从 DTS 导入/导出向导中执行 DTS 包

企业管理器

企业管理器

从企业管理器执行包

可以从 SQL Server 企业管理器控制台树的"数据转换服务"节点执行包。不必打开包就可以执行它。

从 SQL Server 企业管理器中执行 DTS 包

企业管理器

企业管理器

从其它工具执行包

也可以用下面的方法运行包：

  • 从命令提示处发出 dtsrun 命令提示实用工具。该实用工具包括多种可用于自定义包执行的命令开关。

  • 使用 DTS 运行实用工具。该实用工具表现为一组对话框，它提供 dtsrun 最常用的执行选项的一个子集。

使用 DTS 运行实用工具执行 DTS 包

企业管理器

企业管理器

使用 dtsrun 执行 DTS 包

企业管理器

企业管理器

请参见

DTS 包执行实用工具

dtsrun 实用工具

执行用 Visual Basic 编写的 DTS 包

调度 DTS 包的执行


调度 DTS 包的执行

可以调度已保存的数据转换服务 (DTS) 包在特定的时间（一次性或按重复间隔）执行。例如：

  • 每天在午夜 12:00。

  • 每周在星期天早上 6:00。

  • 每月的第一天或最后一天。

SQL Server 代理将已调度的 DTS 包作为作业执行。因为 SQL Server 代理为调度控制着基础的自动处理，所以要执行任何已调度的包，必须要首先运行它。若要调度 DTS 包以便执行，请完成下面的一种操作：

  • 在 SQL Server 企业管理器中，右击 DTS 包，然后单击"调度包"命令。

    该选项是调度那些在 DTS 设计器中创建的包以便执行的最简便方法。但是，该包必须已保存到 Microsoft® SQL Server™ msdb 数据库或 SQL Server 2000 Meta Data Services，且需存在于本地服务器上。

    使用调度包选项调度 DTS 包

    企业管理器

    企业管理器

  • 使用 SQL Server 代理以调度在 DTS 设计器中创建的包、利用 DTS 导入/导出向导创建的包，或创建成外部程序的包。

    使用 SQL Server 代理调度 DTS 包

    企业管理器

    企业管理器

    使用 DTS 运行实用工具 (dtsrunui) 中的调度选项。如果需要调度某个已保存为结构化存储文件的包，则使用该选项。

    如果想调度某个包在本地服务器之外的服务器上执行，则在使用 DTS 运行实用工具调度选项前，请首先注册该服务器。

请参见

配置 SQLServerAgent 服务

DTS 包执行实用工具

dtsrun 实用工具


保存 DTS 包

保存数据转换服务 (DTS) 包时，将保存所有的 DTS 连接、DTS 任务、DTS 转换以及工作流步骤，并在 DTS 设计器的设计表中保留这些对象的图形布局。

可以将包保存到：

  • Microsoft® SQL Server™。

    使用该默认保存选项，可以将包存储为 SQL Server msdb 表，这样使您得以：将包存储在您的网络上 SQL Server 的任何实例上；在 SQL Server 企业管理器中保留一个方便的保存包的清单；在包开发进程中，创建、删除及分支出多个包版本。

    将 DTS 包保存到 SQL Server

    企业管理器

    企业管理器

  • SQL Server 2000 Meta Data Services。

    使用该保存选项，对于包操作的数据，可以维护有关这些数据的历史信息。但是，必须要在您的服务器上安装 Meta Data Services，及知识库数据库，而且它们还必须是可操作的。可以跟踪某些列和表，包将这些列和表用作源或目的。也可以使用数据沿袭功能以进行跟踪，查明是包的哪个版本创建了某个特殊的行。可以将这几种类型的信息用于决策支持应用程序。有关更多信息，请参见共享元数据。

    将 DTS 包保存到 Meta Data Services

    企业管理器

    企业管理器

  • 结构化存储文件。

    使用该保存选项，可以通过网络复制、移动及发送包，而不必将文件存储在 SQL Server 数据库中。结构化存储格式允许您在单个文件中维护多个包及多个包版本。

    将 DTS 包保存到结构化存储文件

    企业管理器

    企业管理器

  • Microsoft Visual Basic® 文件。

    使用该保存选项，可以通过编制的程序自定义那些在 DTS 设计器或 DTS 导入/导出向导中创建的包。该选项将包写成 Visual Basic 代码脚本，并且日后可以在自己的开发环境中打开 Visual Basic 文件及修改包定义。有关更多信息，请参见管理 DTS 包程序。

    将 DTS 包保存到 Visual Basic 文件

    企业管理器

    企业管理器

当将包保存到 SQL Server 或结构化存储文件时，可以用一个或多个密码保证包的安全。当将包保存到 Meta Data Services，或保存为 Visual Basic 文件时，不能获得 DTS 包安全性选项。但是：

  • 通过源代码控制系统（例如 Microsoft Visual SourceSafe™），可以保护那些已保存到 Visual Basic 文件的包的安全。

  • Meta Data Services 包含其自已的安全性，可以将这种安全性用于保证 DTS 包的安全。

有关更多信息，请参见在 DTS 中处理包安全性。


将 DTS 包保存到 SQL Server 中

数据转换服务

将 DTS 包保存到 SQL Server

如果想将包存储在自已网络内的任一 SQL Server 实例上，并想保留这些包的一个方便的清单，以及在包开发进程中添加和删除包版本，则可以将数据转换服务 (DTS) 包保存到 Microsoft® SQL Server™ 中。该选项将 DTS 包作为 BLOB（二进制大对象）数据保存到 SQL Server msdb 数据库的 sysdtspackages 表中。

可以保存及删除 SQL Server 包的版本。如果一个包有多个版本，那么可以在 SQL Server 企业管理器中显示版本历史，并且打开所需的版本。否则，就打开最近的包版本。

将 DTS 包保存到 SQL Server

企业管理器

企业管理器

访问保存到 SQL Server 的 DTS 包

企业管理器


将 DTS 包保存到 Meta Data Services

如果计划跟踪包版本、元数据以及数据沿袭信息，请将数据转换服务 (DTS) 包保存到 Microsoft® SQL Server™ 2000 Meta Data Services。

可以将包的版本保存到 Meta Data Services。如果一个包有多个版本，那么可以在 SQL Server 企业管理器中显示版本历史，并且打开所需的版本。否则，就打开最近的包版本。使用 SQL Server 企业管理器所提供的 Meta Data Services 查看工具，还可以查看那些保存在 Meta Data Services 中的包的版本信息。

在将包保存到 Meta Data Services 时，DTS 包保护选项不可用。如果包安全性很重要，那么可以考虑将包保存到 SQL Server 或者保存为结构化存储文件。

如果在 DTS 设计器的外部（例如在 Microsoft Visual Basic® 中）创建了包，则可以指定保存包数据的知识库数据库（如 Microsoft Access）。

版本维护

DTS 设计器维护有关每一个保存的包的版本信息，并且可以将这种信息存储到 Meta Data Services。每个包的版本信息包括：

  • 包 GUID，这是一个用来标识包的全局唯一标识符 (GUID)。

  • 版本 GUID，即标识包版本的 GUID。

当一开始创建包时，包 GUID 和版本 GUID 是相同的，这时只有一个版本。如果保存了对包所做的更改，那么就对包设置版本，并且将一个不同的版本 GUID 指派给新的版本，这个版本 GUID 有别于先前保存的版本的版本 GUID。并不是最后的版本重写前面的版本（像典型的保存操作那样），而是保留每个包版本。

在将包保存到 Meta Data Services 时，通过使用扫描选项，可将版本信息与保存的元数据链接。此外，也可以为包保存数据沿袭信息。这些功能可以允许您跟踪：

  • 对包元数据所做的更改，例如在各个包版本上对表列及键（显示在 SQL Server 企业管理器的元数据浏览器中）所做的更改。

  • 哪个包版本产生了一组特定的转换。若要完成这项工作，请使用 SQL Server 企业管理器中的数据沿袭查阅功能。

将 DTS 包保存到 Meta Data Services

企业管理器

企业管理器

打开保存到 Meta Data Services 的 DTS 包

企业管理器

企业管理器

请参见

共享元数据

在 DTS 中查看元数据


将 DTS 包保存到结构化存储文件

如果想通过网络复制、移动和发送包，而不将包存储到 Microsoft® SQL Server™ 数据库中，则将数据转换服务 (DTS) 包保存到结构化存储文件。

使用结构化存储格式，可以在单个文件中维护多个包及多个包版本。如果要将多个包保存到相同的结构化存储文件，那么当保存时，请使用相同的文件名以及不同的包名称。但是，您保存在结构化存储文件名下的每个包及包版本都会一直存在，直到该文件生命期的终结。对于保存到结构化存储文件的包及包版本，尽管可以个别地编辑这些包及包版本，但是却不能个别地删除它们。因此，保存到结构化存储文件与保存到 SQL Server 相比，需要采用不同的方式管理包版本。

在将包保存到 SQL Server 时，可以删除任何想删除的包版本。对于结构化存储文件来说，只能删除整个文件。对于那些保存在结构化存储文件中的包版本，如果想保留或分支出某个特定的包版本，那么请将该包版本以新文件名保存。建议不要频繁地这么做，因为保存带有多个版本的多个包会生成很多的大文件。

说明 在将 DTS 包保存到结构化存储文件时，会创建带有扩展名 .dts 的文件。

将 DTS 包保存到结构化存储文件

企业管理器

企业管理器

打开保存到结构化存储文件的 DTS 包

企业管理器

企业管理器

请参见

在 DTS 中记录数据沿袭


将 DTS 包保存到 Visual Basic 文件

可以将 DTS 设计器或 DTS 导入/导出向导所创建的数据转换服务 (DTS) 包保存到 Microsoft® Visual Basic® 文件。对于用这种方法保存的包，可以将其结合到 Visual Basic 程序；而对于 Visual Basic 开发人员，他们需要引用 DTS 对象模型的组件，那么这些开发人员就可以将用这种方法保存的包用作原型。

将 DTS 包保存到 Visual Basic 文件

企业管理器

企业管理器

请参见

保存用 Visual Basic 编写的 DTS 包


使用 DTS 包日志

使用数据转换服务 (DTS) 包日志解决执行 DTS 包期间发生的问题。DTS 包日志与 Microsoft® SQL Server™ 的错误日志和 DTS 异常错误日志不同，它包含包中每一步骤的成功或失败信息，可帮助确定发生包错误的具体步骤。每次执行包时，执行信息都追加到包日志中，该日志存储在 SQL Server 的 msdb 表或 SQL Server 的 Meta Data Services 中。可以将包日志保存在任何运行 SQL Server 2000 实例的服务器上。如果包日志不存在，则在运行包时创建该日志。

正在执行的包将有关包中所有步骤的信息写入包日志中，而不管单个的步骤是否运行。如果运行了某个步骤，那么它将保留起始时间及结束时间，以及步骤执行时间。日志中列出未运行的步骤，并且注明这些步骤未被执行。

包日志记录仅可用于运行 SQL Server 2000 实例的服务器上。

与 DTS 包日志一起，DTS 异常错误文件提供有用的疑难解答信息。数据驱动的查询任务和转换数据任务使用异常错误文件保存有关某些数据行（未被复制到目的行）的错误信息，并存储失败的实际源行和目的行。有关更多信息，请参见转换数据的任务。

查看 DTS 包日志

企业管理器


管理 DTS 包属性

在数据转换服务 (DTS) 中，可以使用 DTS 设计器以图形方式检索或设置包属性，或通过编程方式检索或设置。有关通过编程方式管理包属性的更多信息，请参见使用 DTS 对象模型创建 DTS 包。

使用 DTS 设计器可以查看或监视与下列项目相关的属性：

  • 包标识。

  • 错误。

  • Microsoft Windows® 事件。

  • 全局变量。

  • 事务。

查看或修改 DTS 包属性

企业管理器

企业管理器

DTS 设计器也包括称为"脱接编辑"的功能，该功能使您得以查看或修改包中的任何属性。当需要重新配置包连接，使得为一种环境配置的包可以在另一种环境中运行时使用该功能。但是，脱接编辑只应该在其它修改包属性的方法不可用时才用来管理包属性。有关更多信息，请参见用脱接编辑来编辑 DTS 包属性。


查看和修改 DTS 包属性

在数据转换服务 (DTS) 设计器中，可以查看或修改与下列项目相关的属性：

  • 包标识。

    这些属性多数是只读的。这些信息包括包名称、包和版本的全局唯一标识符 (GUID)、创建者名称、创建日期、计算机名称和对包的文本描述。

  • 错误信息。

    可以指定有关日志文件的信息，该信息包含包运行时错误。也可以指定在反映步骤失败的第一个错误出现后是否终止包执行。

  • Microsoft® Windows® 事件。

    可以指定是否将包执行状态写入 Windows 事件日志。还可以定义 Windows 事件的进程优先级以及可以并发执行包的最大任务数量。

  • 包全局变量。

    可以查看有关全局变量的信息，该信息可以被包中的所有 Microsoft ActiveX® 脚本引用。可以创建新的全局变量或者编辑现有全局变量。

  • 数据沿袭。

    在将数据保存到 Microsoft SQL Server™ 2000 Meta Data Services 时，可以跟踪任意一组数据的源以及应用到该组数据的转换。

  • Meta Data Services 扫描。

    可以将 DTS 包引用的对象和 Meta Data Services 中的目录元数据相关联。

  • 事务。

    可以将工作流中的步骤指派给事务，然后根据事务性单元的成功与否提交或回滚各个步骤。要使事务奏效，必须在执行包的计算机上运行 Microsoft 分布式事务处理协调器 (MS DTC)。

查看或修改 DTS 包属性

企业管理器

企业管理器

请参见

将事务并入 DTS 包

在 DTS 中记录数据沿袭

使用 DTS 包日志

在 DTS 包中使用全局变量


用脱接编辑来编辑 DTS 包属性

数据转换服务 (DTS) 设计器包括脱接编辑功能，该功能使您得以查看或修改与包相关的任何属性的值。例如：

  • 常规包属性（例如，包名称、描述、创建者名称、包优先级）。

  • 连接属性（例如，服务器名称、用户名称和密码）。

  • 任务属性（例如，自定义任务、转换数据的任务和数据驱动的查询）。

  • 步骤属性，它包括优先权约束。

  • 全局变量。

使用脱接编辑功能可以：

  • 当源或目的连接不可用时，修改包。通常，在生成 DTS 包时，需要进行连接，作为防止设置属性或预防包括无法工作的组件的措施。脱接编辑使您得以在不建立实时连接的情况下就可以编辑包。例如，可以修改在测试系统上创建的包，这样它可以在其它站点的生产系统上运行。可以使用脱接编辑将源和目的连接属性更改为生产系统的连接属性，而无须与生产系统建立真正的连接。

  • 通过 DTS 设计器用户界面可以查看和修改未表现的属性，例如任务名称、步骤名称和连接名称。

    使用脱接编辑更改任务名称时，更改与任务相关的步骤的 TaskName 属性。

注意 因为脱接编辑不会对属性值的更改进行验证，所以输入无效的数据会导致包失败，并且会对系统造成不必要的影响。脱接编辑类似于注册表编辑器。它们都是直接编辑属性的强大工具，建议只有当没有其它方法修改值时，才由高级用户使用这两种工具。

使用脱接编辑修改 DTS 包属性

企业管理器

企业管理器

请参见

动态属性任务


在 DTS 中处理包安全性

若要查看、编辑、保护、调度和运行网络上的数据转换服务 (DTS) 包，应该了解影响包访问、权限和连接的问题。

DTS 包密码

将包保存到 Microsoft® SQL Server™ 或作为结构化存储文件保存时，可以使用 DTS 包密码。除了使用 Windows 身份验证或 SQL Server 身份验证密码连接到 SQL Server 的实例之外，还使用 DTS 密码。可以使用下列类型的 DTS 包密码：

  • 如果设置一个所有者密码，包用户需要该密码以编辑或运行包。

  • 如果设置一个用户密码，还必须设置一个所有者密码。只有拥有此用户密码权限的用户才能运行该程序包。否则，他们不能打开或编辑包，除非他们可以访问所有者密码。

强烈建议您为所有包使用 DTS 包密码，以确保包和数据库的安全性。至少要在保存了数据源的连接信息并且没有使用 Windows 身份验证的时候，坚持使用 DTS 包密码。

设置 DTS 包密码

企业管理器

企业管理器

包调度和安全问题

通常，一个包从 DTS 设计器、DTS 导入/导出向导、DTS 运行实用工具或从在当前登录的用户的安全环境下执行的命令提示符处运行。但是，调度执行的包在运行该包的 SQL Server 代理程序作业的安全环境下运行。该作业的所有者可能与当前登录的用户相同或不同。考虑下列类型的所有权：

  • 对于在 Microsoft® Windows NT® 4.0 或 Microsoft Windows® 2000 帐户下创建的包，作业在启动 SQL Server 代理程序的帐户的安全环境下运行。

  • 如果作业由一个属于 sysadmin 固定服务器角色的登录所有，则包的安全环境默认为用来启动本地 SQL Server 代理程序的帐户。如果服务器已注册使用 Windows 身份验证，那么作业的所有者是 SQL Server 代理程序的帐户。如果服务器已注册使用 SQL Server 身份验证，作业的所有者是该 SQL Server 登录。

  • 如果作业由一个非 sysadmin 固定服务器角色的成员的登录所有，则包在 SQLAgentCmdExec 帐户的环境下运行，并使用该帐户的权利和权限。

所有权冲突可能产生下列类型的问题：

  • 在包中指定的文件路径可能在不同的安全环境中不可见。也就是说，执行包的一个不同的用户可能无法访问作为包生成器的相同的共享点（例如，用户可能没有包生成器映射的驱动器号）。要防止这个问题，请在指定外部文件时使用通用命名规则 (UNC) 的名称而不是文件路径。

  • 运行包的 SQL Server 代理程序作业的所有者没有访问所指的路径或包中的连接的权限。例如，作业的所有者也许只能进行本地服务器访问。如果出现这个问题，查看 SQL Server 企业管理器中作业的安全环境并注销这个 SQL Server 的实例。然后登录返回到使用作业的安全环境的 SQL Server 的相同实例并尝试运行该包。

  • 对于在 Microsoft ActiveX® 脚本中调用 COM 组件的包，被调用的组件必须存在于正在运行该包的工作站上。同时，SQL Server 代理程序作业帐户必须具有运行该作业的权限。

在上述所有情况中，如果将包所使用的外部文件复制到执行包所在的同一台服务器上，可能会预占因所有权问题导致的包失败。在 COM 组件被一个调度包使用的情况下，被调用的组件必须装载到安装 SQL Server 实例的计算机上，并且 SQL Server 代理程序必须具有使用对象的权限。否则，不能成功地执行包。

重要 如果调度一个具有用户密码而不是所有者密码的 DTS 包，调度作业将不会报告失败，除非包设置成在第一个失败的步骤即失败。这是因为用户没有在包运行之后读取包状况的权限。如果使用所有者密码调度包，则这种情况不会出现。

数据链接文件和安全性

Microsoft 数据链接 (.udl) 文件是可以用来压缩包中连接字符串的未加密文本文件。强烈建议不要在数据链接文件中包含密码信息，因为这些信息对于任何查看文本文件的人都是可见的。如果想要使用数据链接文件保存链接字符串，考虑下列情况：

  • 为连接使用 Windows 身份验证。Windows 身份验证不要求登录信息放置在数据链接文件中。只需要一个标记，指出将要使用的连接是可以信任的。这种连接方法对于数据链接文件来说是安全的。

  • 不要为连接使用 SQL Server 身份验证。SQL Server 身份验证要求将登录和密码信息放置在数据链接文件中。此信息将是不安全的。
保存包安全信息

默认情况下，用来连接到数据源的 Windows 身份验证或 SQL Server 身份验证信息与包一起保存。若要控制身份验证信息的持续性，请在 DTS 设计器中的"高级连接属性"对话框中使用"持续安全信息"选项。这个选项只用于 SQL Server 连接。

可能有多种原因禁止包中 Windows 身份验证或 SQL Server 身份验证信息的持续性。例如，假设要创建一个将在不同于已创建包的环境中测试的包。在这种情况下，可能不需要来自与包一起保存的连接的安全信息，因为该信息不能用于新环境的重新连接。使用来自数据链接文件的解决设置的数据链接进行包连接并使用 Windows 身份验证用于连接。这将增加包的可移动性并维持包安全性。

修改身份验证信息的持续性

企业管理器

企业管理器

请参见

配置 SQLServerAgent 服务

连接 SQL Server

数据链路连接

调度 DTS 包的执行


将功能添加到 DTS 包

Microsoft® SQL Server™ 2000 数据转换服务 (DTS) 具有扩展 DTS 包功能的能力。以下各节提供有关这些能力的信息，并解释如何利用它们。

主题 | 描述
在 DTS 中使用 ActiveX 脚本 | 解释如何编写作为任务、工作流步骤或转换执行的脚本代码。
将事务并入 DTS 包 | 描述如何将多个包步骤（包括多个平台上完全不同的操作）绑定到单个事务单元中。
查找查询 | 解释如何使用查找查询，查找查询使您可以不仅对源和目的连接，而且可以对其它连接运行查询和存储过程。
在 DTS 包中使用全局变量 | 解释如何使用全局变量在不同的包步骤和任务之间传递数据以及如何动态赋值。
在 DTS 中使用参数化查询 | 描述参数化查询如何与多个 DTS 任务一起使用。
从外部源查询 DTS 包 | 解释如何使 DTS 包数据可由外部源（如 SQL 查询分析器）使用，以及如何在分布式查询中联接包数据。


在 DTS 中使用 ActiveX 脚本

在数据转换服务 (DTS) 中，可以使用 Microsoft® ActiveX® 脚本扩展 DTS 包的功能。这些脚本用于实现 DTS 对象模型的对象、属性、方法和集合。使用 ActiveX 脚本可以：

  • 在将数据从其源位置复制到目的位置时格式化并转换数据。

  • 编写用以使用条件逻辑管理包工作流或逐行处理数据的函数。

  • 创建、使用和修改存储在 DTS 全局变量中的值。

  • 操作为数据访问和实用工具功能所生成的 COM 对象。

  • 创建和使用 Microsoft ActiveX 数据对象 (ADO) 连接、命令、记录集和其它访问和操作数据的对象。

Microsoft Visual Basic® scripting edition (VBScript) 和 Microsoft JScript® 附带在 Microsoft SQL Server™ 安装中。如果计划用 VBScript 和 JScript 以外的语言编写 ActiveX 脚本，应确保安装了所使用的脚本语言的语言库。有关更多信息，请在Microsoft Web 站点上的 MSDN® Library 中搜索"VBScript"和"Jscript"主题。

在 DTS 中编写 ActiveX 脚本

在 DTS 中，可以编写下列类型的脚本：

  • 逐行应用于数据的转换脚本。每次从数据源读取一行数据时执行该脚本。

    只将这些脚本添加到以下转换数据的 DTS 任务中：转换数据任务；数据驱动的查询任务；并行数据抽取任务（只能通过编程使用）。这些任务使用数据抽取功能转换数据。

  • 作为任务运行的 ActiveX 脚本。该脚本在每次包调用任务时运行一次。

    可以使用 ActiveX 脚本任务执行在 DTS 设计器的其它任务中不能使用的函数。有关更多信息，请参见 ActiveX 脚本任务。

  • 在包步骤执行前应用于步骤的工作流脚本。该脚本在每次包调用任务时运行一次。

    可以使用 ActiveX 工作流步骤脚本自定义步骤执行。例如，可以在 ActiveX 工作流步骤脚本中使用某些返回代码，以避免执行包中的其它任务，也可以允许任务执行或将任务标记为等待运行。有关编写控制工作流的脚本的更多信息，请参见 DTS 包工作流。

通常情况下，不要使用 ActiveX 脚本任务或 ActiveX 工作流脚本逐行处理数据，因为这比使用转换脚本的效率低。但是这样做也未尝不可。例如，可以使用 ActiveX 脚本任务创建一个或多个 ADO 连接，并用 ADO 记录集中的数据填充一组文本文件。

重要 转换中的 ActiveX 脚本可能会影响 DTS 包的执行速度。因此，如果性能是首要考虑的问题，则在生成包时必须谨慎地使用脚本。有关更多信息，请参见增强 DTS 包的性能。

将 ActiveX 脚本添加到 DTS 包

可以在 DTS 设计器和 DTS 导入/导出向导的包中添加脚本，或者通过编程添加脚本。有关通过编程添加脚本的更多信息，请参见添加 DTS ActiveX 脚本。

添加转换脚本：

  • 在 DTS 设计器的"ActiveX 脚本转换属性"对话框中，添加转换脚本以定义转换数据任务或数据驱动的查询任务的 ActiveX 脚本转换。

  • 在 DTS 导入/导出向导内，在"列映射和转换"对话框的"转换"选项卡中添加转换脚本。有关更多信息，请参见用 DTS 导入/导出向导创建 DTS 包。

添加 ActiveX 脚本任务：

  • 在 DTS 设计器中，将"ActiveX 脚本任务"图标拖至设计表，并在配置该任务时添加此脚本。

添加 ActiveX 工作流脚本：

  • 在 DTS 设计器中，访问与包步骤相关的"工作流属性"对话框。
脚本功能

可以从 ActiveX 脚本访问的功能范围包括：

  • SQL Server 环境。可以在脚本中使用 Transact-SQL 语句并访问 SQL Server 表。

  • 数据访问接口。SQL Server 安装包括一些常见的数据访问接口，如 ADO、数据访问对象 (DAO) 和远程数据对象 (RDO)。可以在脚本中使用这些接口建立连接、创建记录集和执行 SQL 命令。

  • 自定义 COM 对象。如果在运行包的服务器上可以使用在脚本中开发的自定义 COM 对象，则可以访问这些对象。

  • 脚本语言。可以使用编码所使用的脚本语言的任何功能，只要语言的脚本引擎已经安装在服务器上。大多数脚本语言都允许：
    • 使用循环逻辑和条件逻辑

    • 编写用以控制行选择、确定工作流、控制操作的成功或失败或者产生异常错误的函数。这些决定是由 DTS 对象模型所指定的专用返回代码常量做出的。

    例如，VBScript 这类脚本语言使您得以使用该语言提供的内部函数（如 Trim、Len 和 CInt），并通过 IsNumeric 或 IsDate 这样的函数验证字段中的数据。如果使用脚本语言无法获得所需的功能，则可能需要编写 DTS 应用程序或自定义任务。有关更多信息，请参见用 Visual Basic 语言创建 DTS 包。

脚本示例

以下的 DTS ActiveX 脚本示例显示：

  • 转换日期数据、串联列和验证数据的 ActiveX 脚本转换。

  • 连接和使用 ADO 对象并填充全局变量的 ActiveX 脚本任务。
简单列转换

您将一个日销售额表发送到财会部。但是，财会部不是按日历的月份结帐。在每月第 15 天之前的销售额都被认为是这个月的销售额。第 15 天或之后的销售额则被认为是下一个结帐月份的销售额。

下面的 ActiveX 脚本转换是用 VBScript 语言编写的。该脚本将所有列从源表复制到目的表。除了 AccountingMonth 列，每一行源数据都要复制。对于 AccountingMonth 列，检查 Sale_Date 以弄清楚销售额是在第 15 天之前还是之后获得的，并相应地调整 AccountingMonth。

Function Main()
   DTSDestination("DeptName") = DTSSource("DeptName")
   DTSDestination("Sales") = DTSSource("Sales")
   DTSDestination("Sale_Date") = DTSSource("Sale_Date")

' break the day out of the Sale_Date
   theDay = Day(DTSSource("Sale_Date"))

' if the day field is before the 15th, the Accounting Month is the same as
' the current Sale_Date month
   If theDay < 15 then
      DTSDestination("AccountingMonth") = DTSSource("AccountingMonth")
   Else
' if the day is the 15th or later, the sales dollars belong in the next
' Accounting Month
      theMonth = DTSSource("AccountingMonth") + 1
      ' check if we were in December when we added 1 to the month, and       ' roll it to January
      If  theMonth > 12 then
         theMonth = 1
      End if
      DTSDestination("AccountingMonth") = theMonth
   End If

   Main = DTSTransformStat_OK

End Function
串联列

以下是用 VBScript 语言编写的 ActiveX 脚本转换示例，它将源表的 Sales_Month、Sales_Day 和 Sales_Year 列合并到目的表中的单个 Sales_Date 列。该脚本在源数据中的每一行上运行，并可用于逐行操作的任务。

Function Main()
   DTSDestination("CustomerID") = DTSSource("CustomerID")
   DTSDestination("Sales_Date") = Trim(DTSSource("Sales_Month")) _
       + "/" + Trim(DTSSource("Sales_Day")) + "/" +  _
      Trim(DTSSource("Sales_Year"))
   Main = DTSTransformStat_OK
End Function
转换日期数据

当将数据从文件导入 OLE DB 目的表时，如果日期格式在文本或字符字段中且不是 OLE DB 所需的格式（即 yyyy-mm-dd hh:mm:ss:sss），可以使用 VBScript CDate 函数转换日期数据。当源数据有多种格式时 CDate 很有用。如果源数据是单一格式，可以考虑用更加快捷的"日期时间"转换。

Function Main()

   DTSDestination("Total Sales") = DTSSource("Total Sales ")
   DTSDestination("DestColumnDate") = CDATE(DTSSource("SourceColumnDate"))

   Main = DTSTransformStat_OK

End Function
使用 FileSystemObject 从文本文件中读取值

在下面的 VBScript 示例中，输入文本文件 Start_End_Dates.txt 包含要读入全局变量的开始和结束日期。该文本文件存储在 C:\ 驱动器上。开始日期是文本的第一行并包含"01/01/00"，而第二行包含结束日期"01/31/00"。包执行且脚本运行后，将显示两个消息框。第一个消息框显示"开始日期是：01/01/00"，而第二个消息框显示"结束日期是： 01/31/00"。

' Read start and end dates from a flat file and
' store the values in dynamically generated global variables
'Function Main()

    dim oFSO
    dim x

'  instantiate the Scripting Object
    set oFSO = CreateObject("Scripting.FileSystemObject")

'   Open the file
    set x = oFSO.OpenTextFile("C:\Start_End_Dates.txt")

'  store the first line, which is the Start Date, in a global variable
    DTSGlobalVariables("StartDate").value = x.Readline
    MsgBox "The Start Date is: " & DTSGlobalVariables("StartDate").value

'  store the second line, which is the End Date, in a global variable
    DTSGlobalVariables("EndDate").value = x.Readline
    MsgBox "The End Date is: " & DTSGlobalVariables("EndDate").value

    x.Close

    Main = DTSTaskExecResult_Success

End Function
使用 ADO 连接和记录集检查记录

下面的 ActiveX 脚本创建与 Northwind 数据库和 employee 表的连接并计算职员记录数。如果在表中找到职员记录，则该脚本显示职员数并给包返回一个成功标志。否则脚本返回失败标志。这些标志可用于触发其它任务。例如，成功标志可以发出表有记录的信号，然后执行大容量插入任务。可以使用失败标志执行发送邮件任务，通知数据库管理员 (DBA) 存在潜在问题。

dim myConn
dim myRecordset
dim iRowCount

' instantiate the ADO objects
set myConn = CreateObject("ADODB.Connection")
set myRecordset = CreateObject("ADODB.Recordset")

' set the connection properties to point to the Northwind database,
' using the Customers table
myConn.Open = "Provider=SQLOLEDB.1;Data Source=(local); _
   Initial Catalog=Northwind;user id = 'sa';password=''"

mySQLCmdText = "Select 'rowcount' = Count(*) from Customers"

myRecordset.Open mySQLCmdText, myConn

set Flds = myRecordset.Fields
set iRowCount = Flds("rowcount")

If iRowCount.Value = 0 then
   Main = DTSTaskExecResult_Failure
Else
   MsgBox "The number of customers is: " & iRowCount.Value
   Main = DTSTaskExecResult_Success
End If
使用 ADO 记录集将行插入表中

下例中有一个用 VBScript 语言编写的 ActiveX 脚本，显示了如何使用 ADO 连接到某个数据源以及如何将行插入目的表。该例使用 Northwind 数据库中的表以及一个必须由您来创建的 NewEmployeeTerritory 表。该表包含分配给职员的 EmployeeID 和新的 TerritoryID。这些新的区域分配需要输入到 EmployeeTerritory 表中。

若要运行下例，请执行以下步骤：

  1. 在 Northwind 数据库中创建一个名为 NewEmployeeTerritory 的表并使该表与 EmployeeTerritory 表的架构相同。

  2. 将下面四条记录插入 NewEmployeeTerritory 表中：

    EmployeeID TerritoryID

    1             03801
1             07960
3             40222
9             11747
  3. 在 DTS 设计器中创建一个新 DTS 包。

  4. 将一个 ActiveX 脚本任务拖到设计表上。

  5. 在 ActiveX 脚本框中，在 FUNCTION MAIN() 和 END FUNCTION 语句之间添加以下代码：
    ' These values were copied from the ADOVBS.INC file.
'---- CursorTypeEnum Values ----
Const adOpenForwardOnly = 0
Const adOpenKeyset = 1
Const adOpenDynamic = 2
Const adOpenStatic = 3

'---- CommandTypeEnum Values ----
Const adCmdUnknown = &H0008
Const adCmdText = &H0001
Const adCmdTable = &H0002
Const adCmdStoredProc = &H0004

dim countr

' Instantiate the ADO objects.
set mySourceConn = CreateObject("ADODB.Connection")
set mySourceRecordset = CreateObject("ADODB.Recordset")

'Set the connection properties to point to Northwind.
'Use the NewEmployeeTerritories table.
mySourceConn.Open = "Provider=SQLOLEDB.1;Data Source=(local); _
    Initial Catalog=Northwind;user id = 'sa';password=''"

mySQLCmdText = "Select * from NewEmployeeTerritories"

'Execute the mySQLCmdText, and put the data into the myRecordset object.
mySourceRecordset.Open mySQLCmdText, mySourceConn, adOpenKeyset

If mySourceRecordset.RecordCount < 1 Then
    MsgBox " There are no records found. Return a Failure code"
    Main = DTSTaskExecResult_Failure
Else
' Since we have records to insert into the EmployeeTerritory table, create
' a Connection object and do the INSERT.
    dim EmpID, TerrID, myDestSQL
    set myDestConn = CreateObject("ADODB.Connection")
    myDestConn.Open = "Provider=SQLOLEDB.1;Data Source=(local); _
    Initial Catalog=Northwind;user id = 'sa'"

    for countr = 1 to mySourceRecordset.RecordCount
        EmpID = mySourceRecordset.Fields("EmployeeID").value
        TerrID = mySourceRecordset.Fields("TerritoryID").value
        ' Put single quotes around the TerrID since it is a varchar and         'needs to have the single quotes when it is in the VALUES list.
        TerrID = "'" & Terrid & "'"

        myDestSQL = "INSERT INTO EmployeeTerritories _
        VALUES ( " & EmpID & ","  & Terrid & ")"
        myDestConn.Execute myDestSQL

        mySourceRecordset.MoveNext
    Next

    Main = DTSTaskExecResult_Success

End If
验证数据

下面的 ActiveX 脚本是用 VBScript 语言编写的，用以逐行修改数据。该脚本使用 Northwind 数据库中的 Customers 表作为数据源，并将数据移入 Northwind 数据库中的新目的表。该脚本验证源数据中的几列，并在将行插入目的表之前转换某些列数据。这种转换将 Company Name 改为大写字符，剪裁姓和名中的起始空格和尾随空格，并用字符串"unknown"填充 Region 字段（如果该字段为空）。

' Verify that there is a CompanyName. If there is, process the record. If
' there is not, skip the record.
If DTSSource("CompanyName") <> "" Then
    DTSDestination("CustomerID") = DTSSource("CustomerID")
    ' Uppercase the Company Name
    DTSDestination("CompanyName") = Ucase(DTSSource("CompanyName"))
    ' Trim leading and trailing spaces from the Name
    DTSDestination("ContactName") = Trim(DTSSource("ContactName"))
    DTSDestination("ContactTitle") = DTSSource("ContactTitle")
    DTSDestination("Address") = DTSSource("Address")
    DTSDestination("City") = DTSSource("City")

    ' Check to see if the region is empty. If it is, fill it with string
    ' of "unknown".
    If IsNull(DTSSource("Region").value  then
        DTSDestination("Region") = "unknown"
    Else
        DTSDestination("Region") = DTSSource("Region")
        End if

    DTSDestination("PostalCode") = DTSSource("PostalCode")
    DTSDestination("Country") = DTSSource("Country")
    DTSDestination("Phone") = DTSSource("Phone")
    DTSDestination("Fax") = DTSSource("Fax")

    ' This was a successful row. Send an OK status back for this row.
    Main = DTSTransformStat_OK
Else
    ' This row contained data that could not be processed.
    ' Skip it and get another row.
    Main = DTSTransformStat_SkipRow
End If
使用包含数据列的全局变量

下例使用执行 SQL 任务从表中选择数据，并用返回的第一行数据填充全局变量。每一列都存储在各自的全局变量中。下例的后半部分使用 ActiveX 脚本显示存储在全局变量中的数据。

将行值保存到全局变量中

企业管理器

企业管理器

检索行值数据

企业管理器

企业管理器

使用包含行集的全局变量

下例使用执行 SQL 任务从表中检索多行，并将该行集存储在全局变量中。下例的后半部分使用 ActiveX 脚本显示存储在全局变量中的行。

将整个行集保存到全局变量中

企业管理器

企业管理器

检索存储于全局变量中的行集数据

企业管理器

企业管理器Manager

请参见

ActiveX 脚本任务

数据驱动的查询任务

DTS 包工作流

转换数据任务

在 DTS 包中使用全局变量


在 DTS 中使用返回代码

在数据转换服务 (DTS) 中，可以使用 Microsoft® ActiveX® 脚本返回代码进行以下操作：

  • 处理转换中的行数据，包括处理插入、错误和异常错误。

  • 在转换脚本中设置跳行、重新使用行、选择是否将该行写入目的表以及根据错误终止行处理的条件。

  • 控制包工作流或步骤执行。

  • 执行正确查询类型的数据驱动的查询。

DTS 提供许多返回代码常量。根据使用 ActiveX 脚本的不同位置，这些返回代码对包或行有不同的效果：

  • 在 ActiveX 脚本任务中使用的返回代码发送到包，返回代码在包中控制优先顺序约束使用过程中的步骤流。某个任务的成功或失败将激活对其后任何任务的任何"成功时"或"失败时"优先顺序约束。

  • 转换脚本或逐行操作的脚本中使用的返回代码应用于正在处理的行。

说明 使用返回代码常量，而不是脚本中的转换返回代码的十进制值或十六进制值。

  • 数据驱动的查询任务中的返回代码定义在每个处理的行上执行的 SQL 查询。
使用多个返回代码

有些情况需要多个返回代码。例如，如果希望多次转换某行但不希望将它多次插入目的表，则可以使用 DTSTransformStat_SkipFetch 再次转换该行。或者可以使用 DTSTransformStat_SkipInsert 避免将它放入目的表。但是，没有任何返回代码可以同时执行这两个操作。在这种情况下，可以使用 OR 运算符组合操作。例如，Main = DTSTransformStat_SkipFetch OR DTSTransformStat_SkipInsert 将使两个操作都发生。DTSTransformStat_SkipFetch 避免转换其它行，而 DTSTransformStat_SkipInsert 避免将行插入目的表。

请参见

DTSTransformStatus


调试 ActiveX 脚本

如果安装了 Microsoft® Windows® 2000、Microsoft Visual InterDev® 6.0 或 Microsoft Windows NT® 4.0 Option Pack，则可以使用这些产品所提供的脚本调试程序排除 Microsoft ActiveX® 脚本中的故障。有三类事件会导致错误：

  • 脚本执行过程中强制中断。

  • 错误的脚本语法或对象。

  • 包含错误引用的对象。

调试这些错误的能力取决于是否选定了"启用实时调试"复选框。

选择启用实时调试选项

企业管理器

企业管理器

重要 如果选择"启用实时调试"复选框，则在运行前应保存脚本或数据转换服务 (DTS) 包，否则将丢失以前的更改。当关闭调试程序窗口时，也将关闭脚本和正启动的应用程序。

使用代码强制中断执行过程

若要强制脚本代码停止运行，请将一条 STOP 语句插入 Microsoft Visual Basic® scripting edition (VBScript)，或将一条 Debugger 语句插入 Microsoft JScript® 代码。

  • 如果没有选定"启用实时调试"复选框，则脚本不显示任何错误并返回成功完成的消息。

  • 如果选定了"启用实时调试"复选框，则将出现一个未处理的运行时错误，同时，系统将给出调试选项。这时：
    • 如果单击"否"，则响应与没有选定调试选项时相同：脚本不显示任何错误并返回成功完成的消息。

    • 如果单击"是"，则将打开调试窗口，可以使用调试程序逐步调试代码。
脚本语法或必需对象错误

还可能出现脚本错误（如语法错误）或"必需对象"错误：

  • 如果没有选定"启用实时调试"复选框，脚本将报告在"执行 DTS 包"对话框的状态栏中出现了一个错误。双击出错的步骤，可以看见错误源、对错误的描述和导致错误的代码行号。

  • 如果选定了"启用实时调试"复选框，则调试环境在遇到错误时立即打开。
由于对象产生的错误而导致执行挂起

这些错误由 Microsoft ActiveX 数据对象 (ADO) 这类对象引起。例如，ADO 对象调用 COM 对象没有的属性。这类错误将打开调试程序，打开方法与由于脚本错误或必需对象错误而导致执行挂起时相同。与脚本错误或必需对象错误不同的是，将显示来自对象本身的错误信息。


将事务并入 DTS 包

使用数据库事务处理将多个更新绑定到单个原子单元中。这样有助于确保数据处于一致的状态。分布式事务处理进一步发展了此概念，允许将多个平台上各异的操作绑定到一个事务中。

数据转换服务 (DTS) 使用 Microsoft® 分布式事务处理协调器 (MS DTC) 提供的功能，使 DTS 包开发人员更加受益于分布式事务处理。要进行事务处理，必须在执行该包的计算机上运行 MS DTC。使用 SQL Server 服务管理器启动 MS DTC，或用以验证 MS DTC 正在运行。

使用 DTS 事务处理可以：

  • 将多项任务的结果集合成一个事务，从而保证更新一致。例如，订单和产品项可以通过两项任务上载，这两项任务同时成功或同时失败。

  • 在多台数据库服务器上执行一致的更新。例如，在一个事务环境中，客户地址可以在两个不同的联机事务处理 (OLTP) 系统中更改。

  • 将数据库的修改和消息队列操作组合在一个事务中，以便在异步环境中提供有保证的更新。例如，包可以使用消息队列任务来阅读和删除包含要上载的文件名的信息。如果上载文件的任务失败，接下来的回滚不但将恢复对数据库的更改，而且会将信息置于队列之后。包无须用户干预即可重新启动。

  • 在单个包的控制下执行多项事务。例如，使用执行包任务，可以在三台不同的服务器上同时运行当天的事务序列。有关更多信息，请参见执行包任务。

可以使用 DTS 设计器管理包事务，或编程访问同一功能。有关更多信息，请参见 DTS 设计器和 DTS 编程参考。


配置 DTS 事务属性

一些数据转换服务 (DTS) 包属性和工作流步骤属性用于控制事务的启动、事务中所包含的步骤和最终的提交（或回滚）操作。这些属性可以在 DTS 设计器中设置或通过编程设置，也可以通过 DTS 对象模型的包对象和步骤对象来设置。

DTS 事务设置分成两组。包属性是影响整个包内事务行为的全局设置。步骤属性在单个任务级别上操作。在以下 DTS 事务设置列表中，包属性列在步骤属性之前。在每一个事务选项中，都列出了相应的 DTS 对象模型属性。

在"DTS 包属性"对话框的"常规"选项卡中，可以找到：

  • 第一次出错时使包失败。

    如果选中该复选框，第一步失败就会使包失败，将终止所有任务。如果清除该复选框，则无论发生多少错误，包每次遇到步骤失败仍会继续运行，总能成功完成。

    在 DTS 对象模型中，设置包对象的 FailOnError 属性。有关更多信息，请参见 FailOnError 属性。

在"DTS 包属性"对话框的"高级"选项卡中，可以找到：

  • 使用事务。

    如果选中该复选框，则启用事务。如果清除该复选框，则不创建包事务，并忽略步骤要求联接事务的请求。

    在 DTS 对象模型中，设置包对象的 UseTransaction 属性。有关更多信息，请参见 UseTransaction (DTSMQMessage)。

  • 成功完成包时提交。

    如果选中该复选框，在执行完一个包且下面两项或其中一项为真时，将提交开放包事务中未完成的更新：

    • 没有步骤失败。

    • 清除"第一次出错时使包失败"复选框。

    如果清除"成功完成包时提交"复选框，打开的事务将在包完成后回滚，并且将丢失未完成的更新。

    在 DTS 对象模型中，设置包对象的 AutoCommitTransaction 属性。有关更多信息，请参见 AutoCommitTransaction 属性 (DTS)。

  • 事务隔离级别。

    在该复选框中，可以选择事务中使用的锁定级别，以使用户不会进行脏读、不可重复读取和假想数据。按渐增保护的顺序，可用的隔离级别有："混沌"、"未提交读"、"提交读"、"可重复读取"和"可串行读"。有关更多信息，请参见隔离级别。

在步骤的"工作流属性"对话框的"选项"选项卡中，可以找到：

  • 有事务时联接。

    如果选中该复选框（并启用事务），则步骤会联接包事务。更新将不断积累，直到提交或回滚。如果清除该复选框，则根据请求将每次执行一次更新。

    在 DTS 对象模型中，设置步骤对象的 JoinTransactionIfPresent 属性。有关更多信息，请参见 JoinTransactionIfPresent 属性 (DTS)。

  • 失败时回滚事务。

    如果选中该复选框，步骤失败将触发回滚包事务。未完成的更新将被废弃。如果清除该复选框，则所有更新都保留在事务中，直到下一次提交或回滚。

    在 DTS 对象模型中，设置步骤对象的 RollbackFailure 属性。有关更多信息，请参见 RollbackFailure 属性 (DTS)。

  • 成功完成此步骤时提交事务。

    如果选中该复选框，成功的步骤完成将触发一次事务提交。使未完成的更新成为永久更新。如果清除该复选框，则所有更新都保留在事务中，直到下一次提交或回滚。

    在 DTS 对象模型中，设置步骤对象的 CommitSuccess 属性。有关更多信息，请参见 CommitSuccess 属性 (DTS)。

请参见

包对象 (DTS)

Package2 对象 (DTS)

步骤对象 (DTS)


DTS 事务基础知识

在单个包的执行过程中，事务被启动、联接，然后提交或回滚。提交或回滚操作后，可以重复该循环。

如果数据转换服务 (DTS) 包包括执行包任务，则事务行为与本主题中所描述的会有所不同。有关事务和执行包任务的更多信息，请参见继承的事务。

启动新的包事务

只有当步骤尝试联接时，才会存在包事务。在这个意义上，一个新的事务是为包而创建的，而步骤会继续尝试。如果在第一个事务被提交或回滚前其它步骤尝试联接该包事务，它们将在第一个事务中登记。虽然一个包可以启动多个事务，但一次只能激活一个包事务。

联接包事务

只有处理完任何工作流脚本后才会尝试联接包事务。如果某个步骤联接了包事务，该步骤执行的所有更新将在该包事务中累积。如果步骤没有联接包事务，则数据库更改将以自动提交模式提交：根据请求每次一项。

为了成功联接事务，包步骤必须：

  • 是支持的任务类型之一。例如，支持执行 SQL 任务，但不支持发送邮件任务。

  • 使用输出支持的连接类型。例如，支持与 Microsoft®SQL Server™ 2000 实例连接，但不支持与 Microsoft Excel 2000 电子表格连接。

如果不满足上述条件，则尝试联接包事务将失败，并且包在运行时中断。有关支持的任务和连接类型的更多信息，请参见支持的任务类型和支持的连接类型。

在 DTS 设计器中，步骤将尝试联接包事务，如果：

  • 在"DTS 包属性"对话框中选中"使用事务"复选框。

  • 在步骤的"工作流属性"对话框中选中"有事务时联接"复选框。

    说明 如果步骤联接了包事务，该步骤使用的每个连接将登记在分布式事务中。所有对于此类连接的更新都将在包事务中累积，即使这些更新起源于一个并未显式联接该包事务的步骤。因此，若要通过一个包对同一数据库进行事务性和非事务性更新，必须使用两个连接。

提交和回滚包事务

当一个包事务被提交后，所有累积的更新均成为永久更新。当一个包事务回滚时，所有累积的更新均都将恢复。

下面任一事件发生时，包事务将被提交：

  • 步骤成功完成，且选中"成功完成此步骤时提交事务"复选框。

  • 包成功完成，且选中"成功完成包时提交"复选框。

当以下任意事件发生时，将回滚当前包事务：

  • 包失败。

  • 包结束，且该包的"成功完成包时提交"复选框被清除。

  • 步骤失败，且该步骤的"失败时回滚事务"复选框被选中。

    说明 某些操作可以使当前事务处于无效状态（例如，在提交、回滚或在子包中回滚时失败）。尝试联接或提交无效事务将使包失败。若要终止无效事务并同时启动一个新的包事务，请在控制包中触发一个回滚。


继承的事务

执行包任务允许作为父包的一个步骤执行数据转换服务 (DTS) 包。该子包可以创建自己的包事务，也可以继承父包事务。

如果下面两项同时为真，包将继承父包事务：

  • 该包由一个执行包任务调用。

  • 调用该包的执行包任务同时还联接父包事务。

下面的图表中，六个包都使用事务。每个包都包含大量任务。只显示执行包任务。包 A 执行包 B 和 C，而包 B、C 执行包 D、E 和 F。联接包事务的执行包任务用下划线表示。

包 A、B 和 D 在一个包事务中执行。包 C 和 F 在第二个事务中执行。包 E 将获得自己单独的包事务。

包 A、C 和 E 控制它们自己的事务。包 B、D 和 F 继承它们的事务。

如果某个包与继承的事务一起运行，事务行为就会有很大不同：

  • 不启动新的包事务。步骤联接继承的父事务。

  • 不进行提交。特别是：
    • 如果选中"成功完成此步骤时提交事务"复选框，则忽略事务。

    • 如果选中"成功完成包时提交"复选框，则忽略事务。
  • 即使包失败，包完成后也不发生回滚。但是，如果选中"工作流属性"对话框中的"失败时回滚事务"复选框，则个别步骤可能会回滚父包事务。

    说明 如果子包失败，则其父执行包任务也将失败。如果子包成功完成，则其父执行包任务也将成功完成。如果子包遇到许多错误或回滚包事务，但其"第一次出错时使包失败"属性被清除，则该子包将成功完成。其父执行包任务也将成功完成。

请参见

执行包任务

ExecutePackageTask 对象


支持的连接类型

为了加入数据转换服务 (DTS) 包事务，连接的数据源必须支持分布式事务。如果某个步骤尝试使用不支持的连接联接包事务（例如 Microsoft® Access 2000 表），该步骤会在运行时失败。以下是 DTS 设计器中提供的连接类型，这些连接类型可以提供此种支持：

  • 用于 SQL Server 的 Microsoft OLE DB 提供程序

  • ODBC 数据源

    ODBC 驱动程序必须支持连接特性 SQL_ATT_ENLIST_IN_DTC，并且必须设置该特性。有关更多信息，请参见 ODBC 文档。

  • Microsoft 数据链接

    Microsoft 数据链接用于访问任何已安装的 OLE DB 提供程序。如果是联接分布式事务，OLE DB 提供程序必须实现 ITransactionJoin 接口。有关更多信息，请参见 OLE DB 文档。

如果您的应用程序需要一些访问不支持连接的任务，这些任务将不能联接 DTS 包事务。但是，这种任务的失败仍然可以用于回滚开放事务。


支持的任务类型

通过数据转换服务 (DTS) 获得的自定义任务加入事务的方式会有所不同。例如：

  • 一些任务执行不能加入事务的操作。例如，文件传输协议 (FTP) 任务直接将文件写入磁盘。不可能进行回滚。其它类似的任务有：
    • 动态属性任务。

    • 发送邮件任务。

    • 复制 SQL Server 对象任务。
  • 一些任务允许用户创建自己的脚本或程序，并从 DTS 运行它们。虽然可以创建这些任务，并且能独立地管理它们的本地事务或分布式事务，但它们不能访问 DTS 包事务。这些任务是：
    • Microsoft® ActiveX® 脚本任务。

    • 执行进程任务。
  • 如果支持正确的连接，则某些支持的任务也可以联接包事务。这些任务是：
    • 大容量插入任务。

    • 数据驱动的查询任务。

    • 转换数据任务。

    • 执行包任务。

    • 执行 SQL 任务。

    • 消息队列任务。

上面所有三组任务都可以提交或回滚当前事务。

请参见

大容量插入任务

数据驱动的查询任务

执行 SQL 任务

继承的事务

消息队列任务

转换数据任务


设计 DTS 事务

在设计数据转换服务 (DTS) 事务时，为尽可能防止出现异常结果，建议您遵循以下几个常规设计原则：

  • 如果可能，顺序组织任务。

  • 当并行执行步骤时，使用 DTS 包失败回滚事务。

  • 在包内使用检查点任务以便提交中间结果。

  • 在事务失败时使用执行包任务和包失败来分流。


顺序执行

为了简化数据转换服务 (DTS) 包事务配置，应顺序组织步骤。如果这样做，可以在步骤级别回滚事务。

以下图表显示了一个顺序 ABC 包。

三个执行 SQL 任务按照优先关系顺序排列。只有一个步骤成功后才会开始下一个任务。如果其中任何一项任务失败，将不再执行其它步骤。包的顺序组织使您可以在遇到失败时就回滚事务。

所有的三个任务都联接包事务。如果任何一个任务失败，则事务将回滚，并且包中断。如果任务 C 成功完成，将提交整个事务。

若要将所有三项任务作为单个包事务的一部分来运行，请执行以下操作：

  • 选中包的"使用事务"复选框。

  • 选中每一个步骤的"有事务时联接"复选框。

  • 选中每一个步骤的"失败时回滚事务"复选框。

  • 选中任务 C 的"成功完成此步骤时提交事务"复选框。


并行执行

时间或资源限制可能要求数据转换服务 (DTS) 任务并行执行。这样的结果是，事务配置会变得更加复杂。为了避免异常结果，并行执行步骤时，请使用 DTS 包失败回滚该事务。

下面的图表显示了一个并行 ABC 包。

所有三项任务仍联接同一事务，但是现在希望任务 A 和 C 同时启动。在这种情况下，根据这些任务使用的连接方式，DTS 行为会有所不同：

  • 如果任务 A、B 和 C 全部使用同一个连接，则尽管是并行结构，DTS 仍会顺序执行。强制各任务的优先关系，但是并未规定执行的顺序。

  • 如果任务 A 和 B 使用连接 1，任务 C 使用连接 2，则：
    • 如果连接 1 和连接 2 在同一个 Microsoft® SQL Server™ 2000 实例中，则第二个任务尝试联接事务时，包将失败。

      因此，为保证不会有两个任务作为包事务的一部分同时执行，必须使用优先关系或"在主包线程中执行"工作流属性。

    • 如果连接 1 和连接 2 不在同一个 SQL Server 2000 实例中，则任务 A 和 C 将如期并行执行。
回滚和包事务

如果没有认真进行包配置，则您的包可能会产生意想不到的结果。例如，在上面的图表中，您希望所有的三个任务都联接同一个事务。然而，如果事务属性的设置不正确，可能会导致任务 A 和 C 回滚，同时任务 B 所作的更改则被提交。例如，如果任务 A 和 C 同时启动，而任务 A 完成前任务 C 失败并回滚，会出现什么后果：

  • 任务 A 没有在运行时被取消，而是继续执行，直到正常结束。

  • 任务 A 完成后，由任务 A 或 C 所作的更改将回滚。

  • 回滚对任务 A 的成功或失败没有影响。如果任务 A 没有遇到问题，则会如期成功完成。

  • 如果包没有配置为在遇到第一个错误时失败，则任务 A 成功完成后任务 B 会如期开始。因为任务 B 启动时没有活动的事务，此时会创建一个新的包事务。如果选中"成功完成包时提交"复选框，尽管前面的事务失败，仍会提交任务 B 所作的更改。
执行单个包事务

如果某个事务包括多个并行执行的任务，则当其中一个任务失败时，所有更改都会回滚，并且必须停止执行。一定不能开始执行新的任务。当多个任务可能处于活动状态时，若要执行单个包事务，应使此包失败，然后在包失败时回滚事务。

请按如下方法配置并行 ABC 包：

  • 选中包的"第一次出错时使包失败"复选框。

  • 选中包的"使用事务"复选框。

  • 选中包的"成功完成包时提交"复选框。

  • 选中每一步骤的"有事务时联接"复选框。

  • 清除每一个步骤的"成功完成此步骤时提交事务"复选框。

  • 清除每一个步骤的"失败时回滚事务"复选框。

选中"第一次出错时使包失败"复选框将触发完成截止到第一个步骤失败时的不成功的包。结果是，不再启动其它任务，现有包事务中的所有更新都将回滚。


在包事务中设置检查点

有时，工作通常会分为两个或多个事务。可以在数据转换服务 (DTS) 包中使用检查点任务提交中间结果。

在下面的包关系图中，检查点是一个 Microsoft® ActiveX® 脚本任务。检查点作为占位符使用，只是为了确保包事务正常运行。因为没有其它位置可以提交事务而不引起潜在的问题，所以需要使用检查点。如果在任务 B 和 C 之后有一项作业，且该作业加入了同一个事务，则将执行检查点功能。

任务 A、B 和 C 作为单个事务的一部分执行。如果没有任务失败，检查点任务将在任务 B 和任务 C 都完成后提交新的更新。然后，任务 D 和 E 联接第二个包事务，并在包成功完成时提交。

请按以下方法配置检查点工作流属性：

  • 清除"有事务时联接"复选框。

  • 选中"成功完成此步骤时提交事务"复选框。

有关配置包及其它任务的更多信息，请参见并行执行。


事务失败时分流

任务并行执行时，为了防止出现异常结果，必须经常使数据转换服务 (DTS) 包失败。如果需要在失败时执行某个操作（例如，发送电子邮件信息），则会出现问题。在包中，不能在使包失败的同时又运行其它步骤。

在事务失败后，使用执行包任务和包失败有条件地运行其它步骤。

下面的关系图显示了执行并列运行 ABC 包的包。根据结果，包不是继续运行就是发送一条错误信息。虽然并列运行 ABC 任务只出现在本例中，但是同一过程可用于在任何包失败后分流，即使是那些不使用事务的包。

包中的第一个步骤是作为子包执行并列 ABC 包。步骤 A、B 或 C 的失败会使子包失败，从而使并列运行 ABC 步骤失败。该步骤失败时，错误警告将发送电子邮件消息。但是，如果子包成功完成，则并列运行 ABC 会成功，并开始更多工作。

例如，按以下方法配置包属性：

  • 选中"使用事务"复选框。

  • 清除"第一次出错时使包失败"复选框。

按以下方法配置其它工作工作流属性：

  • 选中"有事务时联接"复选框。

  • 选中"成功完成此步骤时提交事务"复选框。

  • 选中"失败时回滚事务"复选框。

如果"运行并行 ABC"和"更多工作"要联接同一事务，请按如下方法配置"运行并行 ABC"工作流属性：

  • 选中"有事务时联接"复选框。

  • 清除"成功完成此步骤时提交事务"复选框。

  • 选中"失败时回滚事务"复选框。

如果并列运行 ABC 和其它工作要在单独的事务中运行，并在第一次运行后提交更改，可以给子任务委派事务处理。要做到这一点，请按以下方法配置并列运行 ABC 工作流属性：

  • 清除"有事务时联接"复选框。

  • 清除"成功完成此步骤时提交事务"复选框。

  • 清除"失败时回滚事务"复选框。


查找查询

作为转换数据任务和数据驱动的查询任务的一种功能，查找查询使您得以对源和目的之外的其它连接运行查询和存储过程。例如，通过使用查找查询，可以在查询过程中进行单独的连接，并在目的表中包括来自连接的数据。

查找查询使您得以在 Microsoft® ActiveX® 脚本转换中自定义和执行 SQL 语句。该语句可以是存储过程调用，也可以是 SELECT、INSERT、UPDATE 或 DELETE 语句。使用参数为每个源行自定义这些语句，保留在语句中的空白应该在执行前填充。执行查找查询时，您的脚本提供用来替代每个参数的值。结果可以装载到目的列中，也可以作为输入进行进一步的脚本处理。

可以使用查找查询执行：

  • 查找表格格式的信息。

  • 对两个数据库系统执行并行更新。

  • 在输入数据装载之前进行验证。

  • 唤醒调用存储过程以响应输入条件。

  • 使用全局变量值作为查询参数。

可以使用数据转换服务 (DTS) 设计器或 DTS 对象模型创建和管理查找查询。有关使用查找查询编程的更多信息，请参见添加 DTS 查找和全局变量和查找对象 (DTS)。

请参见

数据驱动的查询任务

转换数据任务


配置简单的查找查询

若要配置简单的查找查询，请完成以下步骤：

  1. 创建一个新连接。

    尽管在某些情况下，查找查询可以与源或目的共享一个连接，但如果为其指定自己的连接，则会获得最佳的性能。

  2. 创建并命名参数化查询。

    参数化查询可以是存储过程调用，也可以是 SELECT、INSERT、DELETE 或 UPDATE 语句。通过包含问号来标记参数，并以此代替将在运行时设置的表达式。参数值通常来自源数据，但也可以由全局变量或任何其它可访问 Microsoft®® ActiveX®® 脚本代码的术语提供。

  3. 使用代码创建 ActiveX 脚本转换以执行您的查询。

    使用以下语句来执行查询：

    return value = DTSLookups("query name").Execute(argument list)

    其中 return value 是接收查询结果的变量，query name 是第二步中为查询提供的名称，argument list 是用逗号分隔的参数值列表（查询中的每个问号都有一个参数值）。

在配置查找查询之前，应考虑以下事项：

  • 不使用查找查询的任务比使用查找查询的任务运行速度要快许多。例如：
    • 联接某个源 SQL 查询中两个表的任务总是比从第二个表中查找信息的任务运行速度要快。

    • 运行两个单独的转换数据任务所需的时间，通常比使用查找查询向第二个表中插入数据所需的时间要短。
  • 一般情况下，只有当没有其它选择时，才应该使用查找查询。例如：
    • 因为数据驻留在非 SQL Server™ 数据库中，或源联接生成的数据量超出系统容量，所以无法进行源联接。

    • 必须调用存储过程，或必须运行 DELETE 或 UPDATE 查询。

    • 对于明确性的重要性超出任何性能问题。
查找查询示例

在下面的示例中，源数据包含邮政编码，但是不包含城市。Mail Codes 表包含代表每个邮政编码的行以及代表每个城市名的列。将这个城市名包含在目标行的过程如下：

  1. 创建并命名一个与包含 Mail Codes 表的数据库的连接。

  2. 编写查询语句，使用问号代替邮政编码值：
    SELECT City FROM MailCodes WHERE PostalCode = ?

    配置查找查询时，需要提供连接名称和查询名称。使用在第一步中创建的连接，并将查询命名为 GetCity。

  3. 在 ActiveX 脚本转换中加入以下代码，以执行查询并将所得的城市名放入目标行：
    DTSDestination("City") =     DTSLookups("GetCity").Execute(DTSSource("PostalCode"))

    邮政编码从源行中提取。每次执行查询时，其值将替换问号。

使用多个参数

有时查找查询中会包含多个参数。例如：

  • 当所需的信息有多个列键时。

  • 当 INSERT 或 UPDATE 语句必须填充多个列时。

要使用多个参数配置查找查询，您必须：

  • 将多个参数包括查询语句中。

  • 在执行查询时为每个参数提供值。

在下面的示例中，您需要检索城市名（给定了邮政编码和国家）。GetInternationalCity 查询包含两个参数：

SELECT City FROM MailCodes WHERE PostalCode = ? AND Country = ?

在 ActiveX 脚本中，为邮政编码和国家提供的值如下：

DTSDestination(City) = DTSLookups("GetInternationalCity").Execute _
   (DTSSource("PostalCode"), DTSSource("Country"))
查找多个值

有时，您希望使用单个的查询检索多个值（例如，如果您有客户帐号，并且需要姓名和地址）。

数据转换服务 (DTS) 通过返回变量数组，处理查询结果中的多个列。数组中的每个条目均控制一个结果值。第一个值的下标为 0。

在下面的示例中，您需要检索城市和地区（给定了邮政编码）。GetCityAndRegion 查询选择两个必需的列：

SELECT City, Region FROM MailCodes WHERE PostalCode = ?

通过以下 ActiveX 脚本代码访问返回的值：

dim varArray
varArray = DTSLookups("GetCityAndRegion").Execute(DTSSource("PostalCode"))
DTSDestination("City") = varArray(0)
DTSDestination("Region") = varArray(1)

请参见

数据驱动的查询任务

DTS 连接

转换数据任务

在 DTS 中使用 ActiveX 脚本

在 DTS 中使用参数化查询


管理查找查询中的零个或多个结果行

当运行查找查询时，数据转换服务 (DTS) 总是返回结果集中的第一行。尽管没有授予您访问后续行的权限，但可以获得返回的行数。这在查询返回零行或多行时可能会非常有用。

包含零行的结果集

查找查询有时无法返回任何行。例如，如果您跟踪雇员休假的天数，可能会发现某些人没有休过假。

当查找查询检索零个行时，DTS 将返回一个空变量。在 Microsoft®® ActiveX®® 代码中，可以使用 IsEmpty() 函数测试这种情况。

例如，如果给定的雇员没有休过假，VacationDays 查询则返回零行：

SELECT EmployeeID FROM VacationDay WHERE EmployeeID = ?

使用这种查询，可以通过使用以下 ActiveX 脚本代码跳过未曾休过假的雇员：

Dim LookupResults
LookupResults = DTSLookups("VacationDays").Execute(DTSSource("EmployeeID"))
If IsEmpty(LookupResults) Then
   Main = DTSTransformStat_SkipRow
Else
   Main = DTSTransformStat_OK
End If

说明 如果所有数据均驻留在运行一个 Microsoft SQL Server™™ 实例的计算机中，则通过使用源查询代替查找查询以便筛选出不需要的行，从而提高性能。

包含多行的结果集

查找查询有时会返回多行。例如，某个雇员可能休过许多天假。

在查找查询检索多个行时，DTS 会废弃除第一行以外的所有行。如果这样可以接受，可以在查询中使用 ORDER BY 短语，将最重要的行放到结果的最上面。任何情况下，返回的行数均可以通过查找查询的 LastRowCount 属性访问。

例如，假设您需要准备一份休假总结。RecentVacationDays 查询列出某个雇员的休假日期，而最近一次休假列在第一行：

SELECT VacationDate FROM VacationDay WHERE EmployeeID = ?
   ORDER BY VacationDate DESC

然后，通过以下 ActiveX 脚本代码获得每个雇员最近的休假日期和休假的总天数：

DTSDestination("LastVacationDate") =    DTSLookups("RecentVacationDays").Execute(DTSSource("EmployeeID"))
DTSDestination("NumberOfVacationDays") =    DTSLookups("RecentVacationDays").LastRowCount

如果某个雇员未曾休过假，上面的代码将使 LastVacationDate 为空，并将 NumberOfVacationDays 设置为零。

请参见

在 DTS 中使用 ActiveX 脚本


使用查找查询修改数据

查找查询不仅仅局限于 SELECT 语句。INSERT、DELETE 和 UPDATE 语句以及存储过程调用均可以在查找查询中出现。

当提供了 EmployeeID 时，UpdateEmployee 查询可以更新 Employee 表中的某个值：

UPDATE Employee SET HasTakenVacation = 0 WHERE EmployeeID = ?

使用下面的 Microsoft® ActiveX®® 脚本代码为源行集中的每一行执行查询：

DTSLookups("UpdateEmployee").Execute(DTSSource("EmployeeID"))

说明 INSERT 查询可以与转换数据任务一起使用来拆分源行集，将行发送到两个不同的表中。然而，当两个表都驻留在 Microsoft SQL Server™™ 数据库中时，这样做会导致执行时间比顺序运行启用了快速装载的两个转换数据任务所需的时间要长。

请参见

在 DTS 中使用 ActiveX 脚本


使用多个查找查询

数据转换服务 (DTS) 对可以在单个 Microsoft® ActiveX®® 脚本转换中出现的查找查询的数量没有任何限制。因此，可以使用多个查找查询来执行：

  • 根据源事务表中的值，添加、更改或删除帐户。

  • 只有在查询成功返回之后才执行更新。

  • 查找联机事务处理 (OLTP) 系统给定了对应值的维度表键。
执行更新

VacationDays 查询和 UpdateEmployee 查询可以组合使用，以便只更新那些未曾休过假的雇员：

Dim LookupResults
LookupResults = DTSLookups("VacationDays").Execute(DTSSource("EmployeeID"))
If Not IsEmpty(LookupResults) Then
   DTSLookups("UpdateEmployee").Execute(DTSSource("EmployeeID"))
End If
查找维度表键

数据仓库维度表经常使用标识字段作为关键字段。这些字段不一定出现在为数据仓库提供事实的 OLTP 系统中。例如，在 OLTP 系统中，产品可能使用 SKU 字段作为关键字段，而在数据仓库中，则使用自动生成的 ProductID 字段作为关键字段。在插入新的 SalesFact 之前，必须使用 SKU 字段在数据仓库中查找对应的 ProductID 值。

在下面的示例代码中，GetProductID 查询检索给定了作为参数传入的 SKU 的 ProductID：

SELECT ProductID FROM Product WHERE SKU = ?

采用同样的方法，也可以检索给定了帐号的 CustomerID。下面是 GetCustomerID 查询：

SELECT CustomerID FROM Customer WHERE AccountNumber = ?

使用下面的 ActiveX 脚本代码填充 SalesFact 表中的 ProductID 和 CustomerID 列：

DTSDestination("ProductID") =
   DTSLookups("GetProductID").Execute(DTSSource("SKU"))
DTSDestination("CustomerID") =
   DTSLookups("GetCustomerID").Execute(DTSSource("AccountNumber"))

若要查找其它值（例如 StoreID），请添加其它查询和其它脚本代码行。

有关上例中出现的查询的更多信息，请参见管理查找查询中的零个或多个结果行或使用查找查询修改数据。


在 DTS 包中使用全局变量

执行数据转换服务 (DTS) 包时，可以保存某个 DTS 步骤的数据或值，以传递到后续步骤中。例如，可以使用保存的数据更改后续步骤的执行方式，或动态修改 SELECT 语句。

在 DTS 任务中使用全局变量时，可以：

  • 根据财务部门的财政日历，将全局变量设置为月末记帐日期。要完成该设置，可以使用 Microsoft ActiveX® 脚本任务检索值，或在设计期间将全局变量设置为月末记帐日期并在执行包期间引用。包内的步骤可以使用该日期确定名称中包含该日期的文件是否存在。如果存在，该步骤就将文件的记录插入表中。

或者，还可以在 WHERE 子句中使用全局变量，确定要装载的特定记录（例如，仅装载在该月末日期修改的记录）。

  • 可以使用执行 SQL 任务一次在数据中填充多个全局变量。所有行集也可以保存在一个全局变量中，作为断开的 ActiveX 数据对象 (ADO) 记录集访问。有关更多信息，请参见执行 SQL 任务。

    然后，可以将该全局变量作为内存中查找表使用。使用执行 SQL 任务，对 state 表发出 SELECT 语句，并将结果存储在一个全局变量中。然后，使用转换数据任务，对每一个源行调用 "StateLookup" 函数，通过全局变量记录集反复使用，并且将源字段中的州代码与表中的州代码匹配。如果有匹配的州，则将该州的全名存储在目的列中。有关更多信息，请参见查找查询。

创建全局变量

可以在 DTS 中创建全局变量，并通过以下方法为这些变量指派值：

  • 在设计时通过使用：
    • DTS 设计器中的"DTS 包属性"对话框。

    • "执行 SQL 属性"对话框。有关更多信息，请参见执行 SQL 任务属性。
  • 在包执行时动态地指派，方法是：
    • 使用 ActiveX 脚本。

    • 从命令提示中发出 dtsrun 命令提示实用工具并使用 /A 命令开关以便分配和初始化全局变量。
全局变量的作用域

作用域是指在内存中变量引用的生存周期。作用域取决于声明或初始化变量的位置。全局变量在执行包之后是否仍然可以访问将取决于创建全局变量的方式。

设计时创建的全局变量保留执行完包时的值（如果保存了包）。例如，假设创建了全局变量"city"并将其值设置为"Boston"。在执行包的过程中，ActiveX 脚本将该值由"Boston"改为"Philadelphia"。在下一次执行该包时，全局变量的值为"Philadelphia"而非"Boston"。如果需要查询在执行某个包后该包全局变量的值，这种方法非常有用。

然而，在 ActiveX 脚本中动态创建的全局变量有两种作用域。如果在 Function Main() 上面创建，则可以用于该脚本中的所有函数。该作用域等价于模块级的作用域。如果在某个函数内部进行了声明，则只能在该函数内部使用。该作用域等价于过程级的作用域。

在 DTS 包中使用全局变量的示例

下面的示例表明如何使用 ActiveX 脚本在 DTS 包中创建、设置、检索和使用全局变量的值。

通过 ActiveX 脚本动态地创建全局变量

如果某个全局变量在运行包时不存在，可以使用 ActiveX 脚本动态地创建一个。要创建一个名为"city"的新全局变量，并为其指派值"Boston"，可以使用以下 Microsoft Visual Basic® Scripting Edition (VBScript) 代码：

   DTSGlobalVariables("city").value = "Boston"

可以在 ActiveX 脚本中动态地创建 COM 对象，并将其存储在全局变量中。下面示例中的 VBScript 代码用来创建 ADO 连接，包中的脚本可以使用该连接执行 SQL 命令并检查 ADO 记录集。在下面的示例中，将创建一个 year-to-date 销售表，其中包含 pubs 数据库中的 Totals 字段：

Function Main()
   dim conn
   set DTSGlobalVariables("MyConn").value = CreateObject("ADODB.Connection")

   set conn = DTSGlobalVariables("MyConn").value
   conn.provider="sqloledb"
   conn.open  "(local)", "sa", ""
   conn.DefaultDatabase = "pubs"
   conn.execute("Create Table YTDSales (Totals int)")
   Main = DTSTaskExecResult_Success
End Function

下面的代码示例表明如何使用 Microsoft JScript® 创建 year-to-date 的 sales 表：

function Main()
{
DTSGlobalVariables("MyConn").value = CreateObject("ADODB.Connection");
conn = DTSGlobalVariables("MyConn").value;

conn.open = ("provider = sqloledb; data source = (local);user id = sa");
conn.DefaultDatabase = "pubs";
conn.execute("Create Table YTDSales (Totals int)");

  return(DTSTaskExecResult_Success)
}
通过 ActiveX 脚本动态地设置全局变量的值

下面的 ActiveX 脚本代码（使用 VBScript 编写）将名为 count 的全局变量的值设置为 200：

   DTSGlobalVariables("count").value = 200
通过 ActiveX 脚本动态地获得全局变量

下面的 ActiveX 脚本代码用 VBScript 编写，获取的全局变量值名为 count，该值保存在名为 globalCount 的变量中：

   globalCount = DTSGlobalVariables("count").value
通过 ActiveX 脚本动态地使用全局变量

下面的代码将包含文件名的列的值与包含 Julian 日期的全局变量串联在一起，并将新的结果存储在目的表中的文件名列：

   DTSDestination("FileName") = DTSSource("FileName") &    DTSGlobalVariable("julianDate").value

请参见

添加 DTS 查找和全局变量

dtsrun 实用工具


在 DTS 中使用参数化查询

参数化查询是为反复使用而编写的 SQL 查询。其中包含作为数据占位符的参数标记，在每次执行时发生改变。在使用参数化查询的数据转换服务 (DTS) 任务中，占位符语法是一个问号。下面是参数化查询的一个示例：

INSERT INTO Account (CustomerID, CompanyName) VALUES (?, ?)

下面的 DTS 任务使用参数化查询：

  • 执行 SQL 任务

  • 数据驱动的查询任务

  • 转换数据任务

查找查询使用参数检索来自其它连接的信息，可以将查找查询包括在数据驱动的查询任务或转换数据任务中的 Microsoft® ActiveX® 脚本转换中。有关更多信息，请参见查找查询。

向 DTS 任务输入参数

如果运行查询的源支持该查询，则上述所有任务均可以执行用参数编写的 SQL 查询。可以将变量映射到 SQL 参数。数据驱动的查询任务可以从文本文件、全局变量或源数据中引入数据，作为其参数集的输入。转换数据任务只能使用全局变量作为源数据查询的输入。查找查询可以使用来自文本文件、全局变量或其它源数据的数据作为输入。然而，执行 SQL 任务只能使用全局变量作为其参数化查询的输入。有关更多信息，请参见数据驱动的查询任务、转换数据任务和查找查询。

向 DTS 任务输出参数

执行 SQL 任务可以将查询结果保存到全局变量中。可以使用该任务以便用多种格式保存数据。有关这些格式的更多信息，请参见执行 SQL 任务。

转换数据和数据驱动的查询任务可以将查询结果保存到一个表目的列或一个变量中。使用查找查询时，还可以将数据保存到一个数组中。


从外部源查询 DTS 包

通过以下方法，可以使数据转换服务包 (DTS) 包数据用于外部源，例如用于 SQL 查询分析器：

  • 使用 Transact-SQL OPENROWSET 语句查询与转换关联的包步骤。

  • 将包定义为链接服务器，并将包数据联接到分布式查询中。

查询包行集数据时，需要应用以下条件：

  • 提供数据的包必须通过获得该包数据的应用程序启动。不要通过执行包将数据发送到请求的应用程序或过程中。

  • 您只能查询与转换数据任务关联的包步骤。

  • 包必须有要绑定的目的列，并且目的不能是文本文件。

在 DTS 设计器中，通过为与转换数据任务关联的包步骤选择"DSO 行集提供程序"复选框（在"工作流属性"对话框的"选项"选项卡上），可以使包数据可用。然后，外部数据使用者即可使用来自该任务的数据。

只对要查询的包启用"DSO 行集提供程序"复选框。设置该选项后，当包正常运行时，设置该选项的包步骤将无法完成执行过程。设置该标志时，抽取任务只能通过 OPENROWSET 访问。

说明 这些方法通常用来从外部源查询包；不过，您也可以通过在执行 SQL 任务中发出 OPENROWSET 查询和分布式查询，或作为其它转换数据任务的源，从某个包内部查询其它包。

请参见

OPENROWSET

转换数据任务

使用 SQL 查询分析器


使用 OPENROWSET 查询包

可以使用 Transact-SQL OPENROWSET 语句对数据转换服务 (DTS) 包运行查询。

要准备一个包作为数据源，请为包步骤选择"DSO 行集提供程序"复选框（在"工作流属性"对话框的"选项"选项卡上）。

使用 OPENROWSET 查询包之前，应先考虑以下事项：

  • DTS 使用自己的 OLE DB 提供程序 DTSPackageDSO。使用 OPENROWSET 时，只指定其 provider_name、provider_string 和 query 参数：
    • provider_name 参数使用 'DTSPackageDSO'。

    • 根据需要使用 dtsrun 命令开关的任意组合，为 provider_string 参数描述该包。有关 dtsrun 命令开关的更多信息，请参见 dtsrun 实用工具。

    • query 参数使用 'SELECT *'、'SELECT * FROM <package name>' 或 'SELECT * FROM <package step name>'。
  • 如果为包中的多个步骤选择了"DSO 行集提供程序"选项，则需要在 OPENROWSET query 参数中指定包步骤名。包步骤名可以从要查询数据的步骤的"工作流属性"对话框的"选项"选项卡中复制。

  • 如果保存了包的多个版本，则可以使用 dtsrun 命令开关 /v package_version_guid_string 指定包版本。如果没有指定包版本，则使用最近保存的版本。

有关使用 Transact-SQL OPENROWSET 语句的更多信息，请参见 OPENROWSET (T-SQL)。

查询保存到文件的包

假设您希望使用 SQL 查询分析器查询保存到本地服务器上 Dso.dts 的包。请使用以下查询语句：

SELECT * FROM OPENROWSET('DTSPackageDSO', '/FC:\Dts\Dso.dts', 'Select *')

在 OPENROWSET 语句中：

  • provider_name 参数总是 DTSPackageDSO，是注册表中作为包 OLE DB 提供程序的条目。

  • provider_string 参数包含结构化的存储文件名，前面有 /F dtsrun 命令开关。

  • query 参数是用来通过行集数据传递的 SELECT * 语句。

在上面的包中，如果为多个转换数据任务选择了"DSO 行集提供程序"复选框，则可使用下面的代码查询 Dso.dts 中的第二个包步骤：

SELECT * FROM OPENROWSET('DTSPackageDSO', '/FC:\Dts\Dso.dts',
                  'SELECT * FROM DTSStep_DTSDataPumpTask_2')
查询保存到 SQL Server 的包

在下面的示例中，Sqlpackage 包被保存在运行于本地服务器上的一个 Microsoft® SQL Server™ 实例中。若要使用 SQL 查询分析器查询包，请使用以下查询语句：

SELECT * FROM OPENROWSET('DTSPackageDSO', '/Usa /P /S /NSqlpackage', 'Select *')

在 OPENROWSET 语句中：

  • provider_name 参数总是 DTSPackageDSO。

  • provider_string 参数包含以下 dtsrun 命令开关：/U 代表用户 ID，/P 代表密码（此处为空白），/S 代表服务器的网络名（如果服务器是本地的，server_name 就可以省略，如此处所示），/N 代表 SQL Server 包的名称。

  • query 参数是用来通过行集数据传递的 SELECT * 语句。

如果保存了该包的多个版本并希望引用某个特定版本，需要在 /V dtsrun 命令开关后面包括版本的全局唯一标识符 (GUID) 字符串。该版本 GUID 可以从"DTS 包属性"对话框的"常规"选项卡中获得。使用下面的代码查询上述包的版本：

SELECT * FROM OPENROWSET('DTSPackageDSO',
      '/Usa /P /S /Nsqlpackage /V{3C904BA2-4E83-11D2-BB38-00C04FA35397}',
      'Select *')


对包数据发出分布式查询

可以将数据转换服务 (DTS) 包注册为链接服务器，并对该包发出分布式查询。该功能使您得以将来自各种源的数据（例如来自 Oracle 和 DB2 数据源）合并在一个包中，转换这些数据，并将转换后的分布式查询结果展示给任何外部的数据使用者。

若要对包数据发出分布式查询，则需要通过 sp_addlinkedserver 存储过程将该包定义为链接服务器。下面的示例代码表明如何对 DTS 包使用 sp_addlinkedserver：

sp_addlinkedserver 'DTSOLEDBPkg', 'PackageName', 'DTSPackageDSO', '/FC:\Dts\Dts01.dts')

在 sp_addlinkedserver 命令中：

  • DTSOLEDBPkg 是要创建的链接服务器的名称。

  • PackageName 是 OLE DB 数据源的产品名；在此上下文中，可以提供任何名称或空字符串。

  • DTSPackageDSO 是 DTS 包 OLE DB 提供程序的名称。

  • 最后一个参数指定 DTS01.dts 文件的位置。

将包定义为链接服务器之后，即可执行分布式查询，包括作为数据源的包。下面是分布式查询的一个示例。该查询对 Northwind 数据库的 Orders 表和一个从 Oracle 服务器的 Customer 表中获取数据的包执行一个联接操作。该查询假定 Orders 和 Customers 表有公用键 CustomerID。

SELECT a.OrderID, a.CustomerID, a.OrderDate, b.Companyname, b.Region
FROM Orders AS a, dtsLink...packageNameOracle AS b
WHERE a.CustomerID = b.CustomerID

在上述查询中，packageNameOracle 是 DTS 包名。然而，当包中的多个步骤作为数据源时，可以使用包步骤名。

请参见

配置链接服务器

为分布式查询配置 OLE DB 提供程序

sp_addlinkedserver


共享元数据

数据转换服务 (DTS) 设计器提供将包元数据和数据沿袭信息保存到 Microsoft® SQL Server™ 2000 Meta Data Services 的功能。可以存储包中引用的数据库的目录元数据，以及有关数据集市或数据仓库中特定数据行包版本历史的计帐信息。

DTS 设计器使用自带的信息模型（DTS 信息模型），结构化包元数据和数据沿袭信息并将其保存到 Meta Data Services 中。

若要浏览 DTS 设计器生成的数据沿袭信息和元数据信息，可以使用 SQL Server 企业管理器中的 DTS 浏览器（通过控制台树获得，在"元数据"节点中"数据转换服务"下）。该工具使您得以浏览包的元数据和版本历史记录，并查找生成某行数据的特定包版本。

有关更多信息，请在下述网址的 Meta Data Services 内搜索：Microsoft Web 站点。

请参见

将 DTS 包保存到 Meta Data Services


DTS 信息模型

数据转换服务 (DTS) 使用 DTS 信息模型将数据转换元数据保留在 Microsoft® SQL Server™ 2000 Meta Data Services 中。DTS 信息模型基于开放信息模型 (OIM) 的转换包。

DTS 信息模型描述：

  • 数据转换及它们如何分组成较大的执行单元。

  • 访问的数据类型。

尤其是，DTS 信息模型允许：

  • 数据转换元数据存储在一个明确定义的位置。在 Meta Data Services 中存储这些信息，使您得以在重建数据仓库或数据集市时重新使用现有的信息。

  • 通过多种工具共享数据转换信息。这样可以在生成和维护数据仓库时使用不同供应商的工具。

有关更多信息，请在下述网址的 Meta Data Services 内搜索：Microsoft Web 站点。

请参见

升级 Meta Data Services 信息模型

当升级到 SQL Server 2000 时，还必须升级 Meta Data Services 信息模型，以便将各种 DTS 包版本保存到 Meta Data Services 并从其中检索。否则，当保存到 Meta Data Services 时将收到错误。

升级信息模型时，Meta Data Services 表结构将会修改为支持 SQL Server 2000 Meta Data Services 所提供的附加功能和特性。在升级过程中，现有的知识库数据将以新的表结构保存。

在升级信息模型前，请安装 SQL Server 2000。SQL Server 2000 包含 Insrepim（Insrepim 是模型安装程序）的最新的 DLL 和 EXE 版本。

若要升级信息模型，需要下列条件：

  • 需要 SQL Server 2000 CD 或等价的安装目录，其中包含 DTS 所需的信息模型。若要找到这些信息模型，请在 SQL Server 2000 CD 中搜索 *.rdm 文件。

  • 需要 Insrepim.exe，它是模型安装程序，可创建或升级 Meta Data Services 表并安装信息模型。在升级到 SQL Server 2000 时，该程序将安装在计算机上。

  • 需要安装这些模型的批处理文件。该文件必须驻留在包含 Insrepim.exe 文件的目录内。创建此批处理文件之后，请在命令提示符下运行它。
创建安装批处理文件

在下列批处理文件文本中，将 <placeholder> 值替换为应用于系统的实际值。例如：

  • <path> 必须是 CD 或安装目录的路径。

  • <servername> 必须是 SQL Server 的名称。

  • <sa> 必须是 SQL Server 系统管理员登录。如果用的是 Windows 身份验证，请不要指定此参数。

  • <password> 必须是 SQL Server 系统管理员密码。如果用的是 Windows 身份验证，请不要指定此参数。

信息模型必须严格按下面所显示的顺序安装。以 REM 开头的行是注释：

REM  Usage:  InsRepIM.exe
REM  Syntax:  /f[Model File] /r[Repository connect string] /u[User] /p[Password]
REM
insrepim.exe /f<path>\uml.rdm /rserver=<servername>;database=msdb /u<sa> /p<password>
insrepim.exe /f<path>\umx.rdm /rserver=<servername>;database=msdb /u<sa> /p<password>
insrepim.exe /f<path>\gen.rdm /rserver=<servername>;database=msdb /u<sa> /p<password>
insrepim.exe /f<path>\dtm.rdm /rserver=<servername>;database=msdb /u<sa> /p<password>
insrepim.exe /f<path>\dbm.rdm /rserver=<servername>;database=msdb /u<sa> /p<password>
insrepim.exe /f<path>\tfm.rdm /rserver=<servername>;database=msdb /u<sa> /p<password>
insrepim.exe /f<path>\dts.rdm /rserver=<servername>;database=msdb /u<sa> /p<password>
insrepim.exe /f<path>\sql.rdm /rserver=<servername>;database=msdb /u<sa> /p<password>
insrepim.exe /f<path>\db2.rdm /rserver=<servername>;database=msdb /u<sa> /p<password>
insrepim.exe /f<path>\ocl.rdm /rserver=<servername>;database=msdb /u<sa> /p<password>
insrepim.exe /f<path>\ifx.rdm /rserver=<servername>;database=msdb /u<sa> /p<password>
insrepim.exe /f<path>\olp.rdm /rserver=<servername>;database=msdb /u<sa> /p<password>
insrepim.exe /f<path>\mds.rdm /rserver=<servername>;database=msdb /u<sa> /p<password>
insrepim.exe /f<path>\sim.rdm /rserver=<servername>;database=msdb /u<sa> /p<password>

请参见

Meta Data Services 中的 OIM


在 DTS 中记录数据沿袭

应当在实现和使用数据沿袭信息之前设计一个计划。设计方案时应参考相关因素，例如审核需要、可以管理的沿袭数据量、性能考虑，以及需要跟踪行级沿袭还是列级沿袭，或是两者均跟踪。

如果将数据转换服务 (DTS) 包保存到 Microsoft® SQL Server™ 2000 Meta Data Services 中，则可以记录和跟踪两种类型的数据沿袭：

  • 行级数据沿袭，这种沿袭显示任何数据块的源以及应用于该数据的转换。这种数据沿袭可以在表的包级和行级进行跟踪，并提供完整的数据转换审核记录和 DTS 包执行信息。在 Meta Data Services 中，与这种类型沿袭关联的对象包含沿袭值（包执行全局唯一标识符）、执行包的用户名和服务器名以及执行时间。

  • 列级数据沿袭，这种沿袭提供有关包版本以及包用作源或目的的数据库表和列（如果有）的信息。可以浏览使用特定列作为源或目的的包和包版本，查看特定列在任何保存到 Meta Data Services 的包中是用作源还是用作目的。

使用 DTS 浏览器显示数据沿袭信息。有关更多信息，请参见在 DTS 中查看元数据。

实现行级数据沿袭

以下是实现行级数据沿袭的步骤：

  1. 如果包将使用某个数据库的表作为源或目的，那么连接到该数据库并从其中导入元数据。

    若要导入元数据，则使用 DTS 浏览器，或者右击 SQL Server 企业管理器的"Meta Data Services 包"或"元数据"节点上的"导入元数据"。

  2. 在数据仓库中创建表列，用来接收行级数据沿袭信息。DTS 为每次包执行保留以下沿袭标识符：
    • short（整型）值，代表包版本的校验值。

    • long（唯一标识符）值，代表包版本的全局唯一标识符。

    短的沿袭值占用的目的表空间较少，但是潜在的唯一性较差。其中一个值或全部两个值需要写入数据集市或数据仓库的列中。

  3. 在 DTS 设计器中选择数据沿袭选项。

    这些选项可以在"DTS 包属性"对话框的"高级"选项卡中找到。一旦打开某个包中的数据沿袭选项，在配置转换数据任务和数据驱动的查询任务时，可以使用这两个沿袭值 (GUID)。

  4. 在 DTS 设计器中将数据沿袭源列映射到目的列。

    在这些任务的"转换"选项卡和"转换选项"对话框的选项卡上配置沿袭列。

  5. 将包含数据沿袭信息的包保存到 Meta Data Services 中。

  6. 执行该包。
实现列级数据沿袭

以下是实现列级数据沿袭的步骤：

  1. 创建至少包含一个转换任务的 DTS 包。

  2. 将包保存到 Meta Data Services 中。

  3. 扫描元数据。执行保存操作时，单击"扫描"按钮，然后在"扫描选项"对话框中单击"将包引用解析到所扫描的目录元数据"以保存元数据，然后将包元数据链接到知识库数据库。

有关更多信息，请参见在 DTS 中导入和保存元数据。


在 DTS 中导入和保存元数据

通过 SQL Server 企业管理器或使用数据转换服务 (DTS) 扫描选项，可以将元数据导入 Microsoft® SQL Server™ 2000 Meta Data Services 中。使用 SQL Server 企业管理器导入元数据时，仅从一个数据库中读取元数据。通过选择"扫描选项"对话框中的"扫描所有引用的目录"复选框，可以从包中所有被引用的数据库中读取元数据。

说明 若要能够进行元数据的导入，指定的数据提供程序必须支持 OLE DB 架构行集。

Meta Data Services 的 OLE DB 扫描程序是一种从 OLE DB 数据源导入数据库架构的实用工具。该扫描程序被传递给一个 OLE DB 提供程序，检查架构，然后在 Meta Data Services 中创建一组对应的实例对象。

如果将包信息保存到 Meta Data Services，则可以保存与包中引用的数据库有关的元数据，例如：

  • 主键和外键。

  • 列的类型、大小、精度、小数位数和可空性的信息。

  • 索引。

可以通过 DTS 浏览器查看保存到 Meta Data Services 的元数据信息。有关更多信息，请参见在 DTS 中查看元数据。

请参见

使用 OLE DB 扫描程序


在 DTS 中查看元数据

数据转换服务 (DTS) 使您得以在 SQL Server 企业管理器中查看元数据（通过控制台树，在"元数据"节点中的"数据转换服务"下）。可以：

  • 为所有被扫描到 Microsoft® SQL Server™ 2000 Meta Data Services 的数据库生成一个分层显示的元数据，然后跳转到关于引用该元数据的 DTS 包的信息。如果定期扫描对目录元数据的更改，则该显示会提供有关元数据更改的有用的历史信息。可以显示与元数据任意项关联的包版本属性，以及这些包的版本历史记录。

  • 检索填写某行数据的包的特定版本和日期。如果正在跟踪包的数据沿袭信息，则 DTS 浏览器将要求您输入数据行的沿袭跟踪号以标识出创建该行的包。有关更多信息，请参见在 DTS 中记录数据沿袭。

  • 浏览保存到 Meta Data Services 的包版本并更新包。可以显示每个包的版本历史记录，查看所选包版本的属性，以及打开和更新包版本。


DTS 中的使用注意事项

本节描述使用数据转换服务 (DTS) 过程中可能出现的一些具体的数据变换和数据转换问题，并提供其它 DTS 错误信息。

主题 | 描述
增强 DTS 包的性能 | 描述增强 DTS 包性能的方法。
数据变换和转换注意事项 | 提供单个提供程序和 DTS 之间交互作用的详细信息。
异类数据类型的 DTS 驱动程序支持 | 列出 SQL Server 为对异类数据源执行分布式操作而提供的 ODBC 驱动程序和 OLE DB 提供程序。
增强 DTS 中的数据驱动查询 | 描述错误的处理问题，和关于事务的使用、查找以及与数据驱动的查询任务连接的问题。
增强 DTS 中的查找查询 | 列出当在 DTS 包中使用查找查询时应考虑的问题以及执行的详细信息。


增强 DTS 包的性能

有多种因素可以影响数据转换服务 (DTS) 包的性能。

使用 ActiveX 脚本

根据转换的类型和选择使用的脚本语言，使用 Microsoft® ActiveX® 转换脚本的数据抽取操作比复制操作的速度至多慢二到四倍。

使用序号值指出 ActiveX 转换中的列比使用名称指出列要快得多。例如，使用：

DTSSource(1)

而不是：

DTSSource("CustomerID").

当列数小于 20 时，这种速度的提高并不重要，但是当转换包含许多列时，它就变得很重要了。对于包含少数列的情况，可忽略这种优化从而使脚本易于阅读。

此外，用 Microsoft Visual Basic® Scripting Edition (VBScript) 编写的脚本比用 Microsoft JScript® 编写的脚本运行大约快 10%，后者又比用 PerlScript 编写的脚本快大约 10%。

增强数据抽取性能

数据抽取是转换数据任务和数据驱动的查询任务的转换组件。当使用这些任务来转换数据时，在下列情况下能够增强性能：

  • 有大量数据。

  • 转换量巨大。

  • 脚本代码复杂。

若要提高这些情况下的性能，应尽量使用多对多映射。这样可避免为每列映射单独的转换函数。并非每个转换都要唤醒调用脚本引擎，因此性能更快。有关用于转换的列映射的更多信息，请参见映射列转换。

DTS 导入/导出向导创建带有多对多列映射的包。然而，默认情况下，为了提高可读性，DTS 设计器将一对一列映射指派到转换中。因此，当使用 DTS 设计器时，要考虑将尽可能多的转换重新映射到多对多配置。由于脚本中序号的使用，该优化随着转换数量的增加变得更加显而易见。通常情况下，如果有超过 20 个转换，您将会注意到性能显著降低。

数据驱动的查询任务与转换数据任务

当 Microsoft SQL Server™ 是转换数据任务的一个数据目的地时，默认情况下，转换时使用 IRowsetFastLoad 接口。如果 SQL Server 不是目的地，则转换数据任务使用 IRowsetChange 接口（通常发送 INSERT 语句）。

数据驱动的查询任务中的转换通过使用已经准备好的插入操作使用目的服务器上的 ICommand 接口。根据目的 OLE DB 提供程序实施的接口，这也许比转换数据任务中的转换所使用的 IRowsetChange 接口速度更快。然而，使用 ICommand 接口或 IRowsetChange 接口的转换其性能不比使用 IRowsetFastLoad 接口的转换显得更好。

使用大容量插入和 bcp

大容量插入任务创建并执行 Transact-SQL BULK INSERT 语句。用于 SQL Server 的 Microsoft OLE DB 提供程序所支持的 BULK INSERT 比用于执行文本文件导入操作的 bcp 或数据抽取要快很多。因此，如果未使用转换，则使用大容量插入任务以获得更快的吞吐速度。

BULK INSERT 语句受限于文件导入操作。

当导入数据时，bcp 和 DTS 复制操作的速度大致相同。然而，当导出数据时，bcp 操作大致能快三到六倍。本机 bcp（仅应用于 SQL Server 数据）比 DTS 数据抽取速度快。BULK INSERT 和本机 bcp 在速度上不相上下。

使用连接

只有在必需的情况下（例如，驱动程序处于非线程安全状态）才使用 ExecuteOnMainThread 属性。始终避免在 ActiveX 脚本中使用 ExecuteOnMainThread 来实现并发，除非包或包步骤包括：

  • 优先顺序约束，它可以影响 DTS 包操作的顺序。

  • 用 Visual Basic 编写的调用 COM 对象的脚本。

  • 不是空线程的自定义任务。

有关安全性，每次只能有一项任务使用一个连接。若要获得并行执行，必须为每一项任务设置不同的连接。例如，源 (A) 可以连接到两个目的 (C) 和 (D)，但该操作要逐次地发生。同一个源 (A) 也可以被配置为 (B)，通过 (A) 连接到 (C) 以及 (B) 连接到 (D) 来实现并行。

然而，如果两项任务联接了包事务，然后并行访问 SQL Server 的同一个实例，那么包将失败。有关更多信息，请参见将事务并入 DTS 包。

默认情况下，并发步骤的最大数量为 4。使用 MaxConcurrentSteps 属性修改该设置。

使用其它 SQL Server 解决方案

Transact-SQL 查询是移动数据的最快方法，不用在各个表间进行转换或验证。对于多个源，请考虑运行诸如 SELECT INTO 语句之类的分布式查询。

在使用多个包的环境下，每一个 DTS 包必须通过在任一批处理操作中使用 dtsrun 或使用 SQL Server 代理程序，作为单独的进程运行。这使 DTS 成为客户端进程。如果必须将大量的包（例如，1,000 个或更多）作为服务器进程来运行，请考虑使用 SQL Server 2000 复制，它提供快照、事务性的以及合并的功能。此外，如果您的主任务正在复制已发生更改的 SQL Server 数据，请考虑使用 SQL Server 2000 复制。

提高对存储在知识库中的大型 DTS 数据包的查询性能

当查询存储在 SQL Server 2000 Meta Data Services 知识库中的大型 DTS 数据包时，如果增加查询超时值，则可获得更好的结果。这将确保即使在 DTS 包很大的情况下，查询仍有时间往返于知识库数据库。默认情况下，查询超时值为 10 秒。通过创建下列注册表键调整查询超时值：HKEY_LOCALMACHINE\SOFTWARE\Microsoft\Repository\Engine\ODBCQueryTimeout。对于该键，应设置一个比默认值大的值（例如，60 秒或更长）。计量单位为秒。


数据变换和转换注意事项

使用数据转换服务 (DTS) 转变或转换异类数据和目的服务器之间的数据之前，请考虑不同程序、提供程序以及驱动程序支持数据类型和 SQL 语句的方式的变化。

当使用 Microsoft® SQL Server™ 作为数据源时，请考虑下列事项：

  • 将 real 数据类型转换为 int 数据类型也许不能返回精确的值，因为 SQL Server 2000 只支持精确度为 6 位数字的 real 数据类型。例如，real 型数字 2147480000 可能生成 2147480065 的 int 值。

  • 从一个文本文件将 string (DBTYPE_WSTR) 列转换为 date (DBTYPE_DATE) 或 time (DBTYPE_TIME) 列时，OLE DB 数据转换服务组件只接受一种日期或时间格式 (yyyy-mm-dd hh:mm:ss.fffffffff)。使用日期时间字符串转换，或者使用 CDate 函数编码 Microsoft ActiveX® 脚本转换正确地转换日期。

  • SQL Server 2000 不支持 OLE DB 类型 DBTYPE_DATE 或 DBTYPE_TIME。SQL Server 2000 只支持 DBTYPE_DATETIME。

  • 若要通过多步骤访问数据，请避免在转换过程中使用 temp 表。应使用全局 temp 表或在 tempdb 中创建永久表。

  • 从 temp 表返回行的存储过程不能用作转换源。可以使用存储过程从全局 temp 表或表返回行。

  • 在转换数据任务、数据驱动的查询任务或 DTS 设计器中的执行 SQL 任务中使用临时表时，请记住：不能使用 Transact-SQL 语句或调用 temp 表的存储过程作为源。

该限制并不应用于 DTS 设计器的外部。可使用通过编程方式访问 SQL Server temp 表的源语句或存储过程。

DTS 导入/导出向导和 DTS 设计器

当使用 DTS 导入导出向导和 DTS 设计器创建包时，请考虑以下事项：

  • DTS 用户界面允许共享任务中现有的连接，但是同一个连接不能既用在一个转换的源中又用在该转换的目的中。

  • 使用 DTS 设计器或 DTS 导入/导出向导，有可能为一些只作为数据源的提供程序指定只读或正在使用状态（例如，Microsoft Access 和 ODBC DSN ）。单击"连接属性"对话框中的"高级"选项卡，然后在"高级连接属性"对话框中，将模式属性值设置为 1。

  • 使用 DTS 导入/导出向导或 DTS 设计器创建表时，在目的地上创建的表的所有者为当前用户（通常是 dbo），与谁是源表的所有者无关。这将产生这种情况：dbo 试图在目的地创建一个表，而该表的名称已经存在，从而导致尝试失败。

  • 当使用 DTS 设计器定义数据驱动的查询时，数据目的地必须能够支持 OLE DB ICommand 接口。由于这种限制，类似文本文件的目的不被支持。

  • 如果 text、ntext 和 image 类型的字段长度超过 8388602 字节，则 DTS 的复制 SQL Server 对象任务将截断超出的部分。DTS 设计器或 DTS 导入/导出向导不显示任何错误信息，而是显示任务已成功完成。

    唯一的失败指示是一条写入日志文件的日志消息，此文件的名称为 <server>.<database>.log，位于"复制 SQL Server 对象任务属性"对话框的"复制"选项卡所指定的脚本文件目录中。此日志消息详细说明表和列，但不指出发生截断的行。无任何错误记录写入 DTS 错误文件或 SQL Server 日志。

Microsoft SNA Server

当使用 Microsoft SNA Server 作为数据源时，请考虑下列事项：

  • AS/400 和 VSAM 的 Microsoft OLE DB 提供程序不支持 DTS 导入/导出向导用来创建或截断表的 SQL 语句。
Microsoft Access

使用 Access 时，应考虑下列事项：

  • 当从 SQL Server 2000 中将数据导出到 Microsoft Access 97 或更早的版本中，Access 的 Microsoft OLE DB 提供程序在内存中为所有插入设置缓冲区，并且只在 DTS 导入/导出向导完成操作时提交它们。结果是，可以在导出大量表时，面对内存较小的形势。然而，可以通过构造在多个传递中发送较少行数的 SELECT 语句解决该问题。
Microsoft Visual FoxPro

Microsoft Visual FoxPro® 只支持 numeric 数据类型的 (15，9) 精度。如果导出到 Visual FoxPro 的数据超出该精度，则会被截断并四舍五入。

  • Visual FoxPro 不支持 SELECT INTO 语句。

  • DTS 查询设计器支持 Visual FoxPro INSERT VALUE 语句，但不支持使用 SELECT 语句的 INSERT 语句。

  • ODBC 的 Microsoft OLE DB 驱动程序无法使用 FoxPro ODBC 驱动程序将 BLOB 写入 Visual FoxPro，因为 Visual FoxPro 不支持动态游标。
ODBC

当连接到 ODBC 数据源时，请考虑下列事项：

  • ODBC 的 Microsoft OLE DB 提供程序在执行导出操作时需要一个在带有 BLOB 数据列的所有目标表上的唯一键。

  • 当使用带有 SQL Server ODBC 驱动程序的 ODBC 的 Microsoft OLE DB 提供程序时，在安排带有源行集中其它数据类型的列之后安排所有 BLOB 列。可以使用 SELECT 语句重新将 BLOB 列安排到源行集的末尾。DTS 导入/导出向导自动地执行该操作。

    重要 当使用带有 SQL Server ODBC 驱动程序的 ODBC 的 Microsoft OLE DB 提供程序时，请尝试预览带有连接忙错误的存储过程失败。如果使用 SQL Server 的 Microsoft OLE DB 提供程序，该问题就不会发生。

  • 如果一个用于 SQL Server 的 Microsoft ODBC 驱动程序连接由多个线程共享，此连接可能会失败，并返回错误信息"Connection is busy with results for another hstmt"（此连接正忙于其它 hstmt 的结果）。在某些情况下，这将影响通过 DTS 导入/导出向导生成的包。使用以下方法之一解决此问题：
    • 将 MaxConcurrentSteps 属性设置为1 以消除竞争的线程。

    • 创建其它的 ODBC 连接以消除连接共享。

    • 使用用于 SQL Server 的 Microsoft OLE DB 提供程序 (SQLOLEDB) 连接数据库。如果需要连接 SQL Server 6.5 数据库，则运行 Instcatl.sql 以启用通过用于 SQL Server 的 Microsoft OLE DB 提供程序进行访问。
Oracle

当使用 Oracle 作为数据源时，请考虑以下事项：

  • 用于 Oracle 的 Microsoft ODBC 和 OLEDB 驱动程序支持 Oracle 7.3 BLOB 数据类型，不支持 Oracle 8.0 数据类型。例如，不支持 BLOB、CLOB、NCLOB 和 BFILE。

  • 用于 Oracle 的 Microsoft OBDC 驱动程序不支持将 Unicode 字符串发送到 Oracle 服务器中。Oracle 要求在 Unicode 字符串前加上前缀字母 N。

  • 用于 Oracle 的 Microsoft OBDC 驱动程序不支持 Oracle number 数据类型的负向缩放。

  • 用于 Oracle 的 Microsoft OBDC 驱动程序报告无指定精度的 Oracle number 数据类型的长度为 20 位数字。当从 Oracle （不考虑目的）中导入时，如果有多于 20 位的数字，并且如果目的表还不存在，可能必须手工地增加精度。

  • 在表中 Oracle 仅支持一个 LONG (BLOB) 数据列。

  • 不能导入或导出拥有混合或小写名称的 Oracle 列。也不能通过使用 Oracle 列名称（包含使用 DTS 导入/导出向导的空格）来转换或复制数据。Oracle 要求精确指定并引用区分大小写的列名称。

  • 若要在 SQL Server 2000 和 Oracle 之间执行分布式事务，必须使用 Oracle 8.0.4.1 版本或更新版本。有关更多信息，请参见分布式事务。

  • 由于用于 Oracle 的 Microsoft OLE DB 提供程序不支持 IcommandWithParameters，所以它不能用作数据驱动的查询任务的目的地。在 DTS 设计器中使用此提供程序时，转换数据任务、数据驱动的查询任务以及执行 SQL 任务上的"参数"按钮将被禁用。
IBM AS/400 上的 DB2

当连接到 DB2 数据源时，请考虑以下事项：

  • 在 AS/400 系统上不支持 Unicode 或 BLOB。

  • 在 AS/400 服务器上不能转换任何有 NULL 列值的表，因为 AS/400 在其 CREATE TABLE 语句中不支持 NULL 语法。然而，如果编辑 CREATE TABLE 语法以清除对 NULL 的引用时，则可以发送 NULL 值。AS/400 不支持 NOT NULL；如果没指定就假定为 NULL。
使用 Sybase ODBC 驱动程序

当连接到一个 Sybase ODBC 数据源时，请考虑以下事项：

  • 当使用 DTS 导入/导出向导将数据从 SQL Server 转换到 Sybase 11 版本时：
    • 默认情况下，SQL Server numeric (3,0) 数据类型映射为 Sybase smallmoney。为避免数据丢失，请更改此设置。

    • 默认情况下，SQL Server numeric (18,x 或 19,x) 数据类型映射为 Sybase money 数据类型。为避免数据丢失，请更改此设置。

    • 将数据移动到一个新的 Sybase 表时，如果单击了"列映射和转换"对话框中的"确定"按钮，向导会返回错误信息"表已存在"。应该忽略此消息。

    • 不能使用 DTS 导入/导出向导除去并且重新创建 Sybase 表。必须不使用向导来执行此操作。
  • DTS 查询设计器不支持 Sybase SQLAnywhere CREATE TABLE 语句。

  • 由于 SQLAnywhere 驱动程序中的限制，DTS 导入/导出向导每次只能将一个表移动到 SQLAnywhere 数据库。可以使用 DTS 设计器来克服此限制。然而，因为 SQLAnywhere 驱动程序不是安全线程，所以，必须将每个表的 Step 对象的 ExecuteInMainThread 属性设置为 True。

  • 如果表中包含 BLOB 列，则不能将此表复制到 Sybase 目的中。

  • 如果通过编程方式从 Sybase 中复制一个包含 image 数据类型的表，则更改默认的 BLOB 设置会导致失败。
dBase 和 Paradox

当连接到 dBase 和 Paradox 数据源时，请考虑以下事项：

  • dBase 和 Paradox 中的表名称被限制为八个字符。dBase 中的列名称被限制为 10 个字符。
文件导入或导出

当从文本文件导入或导出数据时，请考虑以下事项：

  • 在 char 或 varchar 列中导入或导出数据时，如果客户端 OEM 代码页与服务器上的代码页不同，则某些扩展字符可能不被复制。在 nchar 或 nvarchar 列中导入或导出数据时，所有字符均能正确复制。

  • 如果将 BLOB（包括 SQL Server 的 text 和 ntext 数据类型）列导出到固定长度的文本字段中，则将默认长度设置为 BLBO 字段的最大长度（大约 2GB）。通过选择较小的但足够的字段长度来防止磁盘溢出，或者在可能的时候使用分隔格式。

  • DTS 中使用的用于文本文件的 OLE DB 提供程序不能处理超过两兆字节 (MB) 的 BLOB 数据列。
代码页、排序规则和非 Unicode 数据问题

使用 DTS 在具有不同代码页和排序规则的 SQL Server 数据库间复制数据时，数据可能会丢失或转换不正确。

为避免出现转换问题，应以 Unicode 形式存储国际数据。一旦转换为 Unicode 后，便可很容易地将任何排序规则或代码页中的数据传送到任何 Microsoft SQL Server 2000 或 Microsoft SQL Server 7.0 数据库，而不会出现数据丢失或转换不正确这类问题。

在 Microsoft SQL Server 2000 中，排序规则与具体的代码页相关联并被指派给各个列。（Microsoft SQL Server 7.0 使用单个的默认代码页且不支持列级排序规则）。如果用于源列和目的列的代码页匹配，则非 Unicode 列不会发生数据丢失。在非 Unicode 列间复制数据时，如果源列与目的列不匹配，则将发生数据丢失。在某些情况下，DTS 执行最佳的匹配映射。如果源代码页包含的字符在目的代码页中未出现，则将发生数据丢失。此外，DTS 执行复制时不需要任何转换干预，这将导致在两个代码页中不是由同一个二进制值表示的数据丢失。下面的问题及准则分别针对使用复制 SQL Server 对象任务的情况，和使用复制列转换在不同排序规则或代码页之间复制数据的情况。

复制 SQL Server 对象任务

下面论述复制 SQL Server 对象任务如何处理非 Unicode 数据：

  • 在 SQL Server 2000 实例间复制数据时，只要设置复制 SQL Server 对象任务的 UseCollation 属性，便不会发生数据丢失。

  • 将数据从 SQL Server 2000 实例复制到 SQL Server 7.0 时，对于具有与数据库默认排序规则代码页相匹配的排序规则的列，使用最佳匹配映射。而具有不同代码页的列中所存储的数据，则被解释为正在用默认代码页进行编码处理，转换过程中将伴随数据丢失。

  • 将数据从 SQL Server 7.0 复制到SQL Server 2000 实例时，由于 SQL Server 7.0 无法确定其默认代码页所映射的排序规则，UseCollation 属性不可用。执行复制 SQL Server 对象任务期间不支持任何排序规则，因此，将给非 Unicode 目的列指派目的数据库的默认排序规则。如果与此排序规则相关联的代码页与源数据库的代码页不匹配，DTS 将执行最佳匹配映射。

  • 将数据从 SQL Server 7.0 复制到 SQL Server 7.0 时，如果源数据库和目的数据库使用不同的默认代码页，DTS 将执行最佳匹配映射。

若要确保复制非 Unicode 时不发生数据丢失，可使用 SQL Server 大容量复制功能以 Unicode 格式导出数据，然后使用大容量复制或 DTS 导入数据。

若要禁用默认排序规则脚本，请添加代码或使用脱接编辑或动态属性任务将 SQLDMOScript2_70Only 的值添加到复制 SQL Server 对象任务的 ScriptOptionEx 属性中。

复制列转换

下面论述复制列转换如何在不同代码页之间处理非 Unicode 数据：

  • 如果源列为 Unicode 而目的列为非 Unicode，则执行最佳匹配映射，并尝试在源列和目的列之间转换数据。

  • 如果源列为非 Unicode 而目的列为 Unicode，则不论实际使用的代码页是什么，DTS 都将源列视为属于代码页 1252。

  • 如果源列和目的列都为非 Unicode，原始数据不经转换即被复制，将发生部分数据丢失。


异类数据类型的 DTS 驱动程序支持

数据转换服务 (DTS) 使用由 Microsoft® SQL Server™ 2000 提供的 ODBC 驱动程序和 OLE DB 提供程序来执行对异类数据源的分布式操作。

下表为每个主要的数据源汇总了所提供的驱动程序和提供程序。Microsoft 产品支持服务将帮助解决在使用这些驱动程序和提供程序执行分布式操作时遇到的问题。如果正在使用其它驱动程序或提供程序，请与此 ODBC 驱动程序或 OLE DB 提供程序的厂商联系以获得支持。

数据源 | 驱动程序或提供程序 | 支持
Oracle 8 | 用于 Oracle 的 Microsoft ODBC 版本 2.573.3401.00 | 是
Oracle 8 | 用于 Oracle 的 Microsoft OLE DB 提供程序版本 2.0010.3401.000 | 是
Microsoft Jet 版本 4,0 | 用于 Jet 的 Microsoft OLE DB 提供程序版本 4,0000.2115,0004 | 是
Microsoft Excel 电子表格 | 用于 Jet 的 Microsoft OLE DB 提供程序版本 4.00.2115.15 | 是
Microsoft Jet 版本 3.51 | Microsoft Access 驱动程序版本 4.00.3401.00 | 否
IBM DB2/MVS | StarSQL 32 版本 2.52.0501 | 是
IBM DB2/AS400 | StarSQL 32 版本 2,40,0805 | 是

DTS 和 Informix
  • 不支持 Informix ODBC 驱动程序与 DTS 一起使用。

  • 从 Informix 导入的 DTS 支持 Merant Informix OLE DB 提供程序，但是导出到 Informix 的 DTS 不支持 Merant Informix OLE DB 提供程序。该驱动程序也不能用于导入元数据。

  • 支持 Intersolv Informix ODBC 驱动程序，但是有下列限制：
    • 不能将 BLOB 导出到 Informix。

    • 在 Informix 上创建新表时，DTS 导入/导出向导会将 SQL Server 2000 的 datetime 列不正确地映射为 Informix 'Datetime year to fraction' 数据类型。需要手工地将其更改为 Informix 日期类型。

    • DTS 元数据导入将不会导入 Informix 目录或表信息。


增强 DTS 中的数据驱动查询

通过改变数据转换服务 (DTS) 设计器中的属性，或经过 DTS 对象模型，可以将数据驱动的查询任务配置为：

  • 第一次错误时失败，或继续直到达到最大错误数为止，可能记录错误。

  • 立即提交修改，或联接包事务以便使所有的编辑一起成功或失败。

  • 使用查找查询来帮助填充目的列或确定所要执行的查询。
错误处理和数据驱动的查询任务

数据驱动的查询任务提供了许多支持错误处理和重新启动的功能：

  • 若要调整数据驱动的查询任务对失败的响应，可以更改"数据驱动的查询"对话框中的"最大错误"属性，或调整 DTS 对象模型中的 MaximumErrorCount 属性。

    当失败的数目超出此最大值时，此任务暂停并且步骤失败。

  • 可以按您提供的格式将错误记录到一个您命名的文件中。

  • 为了支持重新启动，您可以将数据驱动的查询任务配置成只在带编号的源行集的子范围上操作。
事务和数据驱动的查询任务

数据驱动的查询任务可以联接包事务。在事务中使用数据驱动的查询任务之前，请考虑以下事项：

  • 如果数据驱动的查询任务不联接包事务，则按照对它们的要求，每次进行一次更新。

  • 如果数据驱动的查询任务联接包事务，则在任务结束时，成功地运行保留在事务中的查询。这些结果必须按照当前或下列步骤提交或回滚，或者在包完成时提交或回滚。
    • 为了联接包事务，绑定的表连接必须支持事务。

    • 数据驱动的查询任务失败不会自动地回滚并成功地运行查询，任务成功不会自动地提交它们。提交和回滚只在响应用户包和工作流设置时才发生。有关更多信息，请参见配置 DTS 事务属性。
查找查询和数据驱动的查询任务

数据驱动的查询任务可以包括查找查询，它是可以被用来查找或修改位于本地或远程连接上数据的其它参数化查询。

在向数据驱动的查询任务中添加查找查询之前，请考虑以下事项：

  • 如果数据驱动的查询任务联接了包事务，并且查找连接支持包事务，那么任何由查找查询所进行的更新也参与包事务。有关更多信息，请参见查找查询。

  • 如果数据驱动的查询任务没有联接包事务，或者 Maximum errors 不等于零，则在对应的数据驱动的查询失败之前存在成功执行查找的可能。如果查找修改了数据，则可能会导致不一致的更新。
其它的使用注意事项

在使用数据驱动的查询任务之前，还应该考虑以下事项：

  • 数据驱动的查询任务绑定的表必须能够支持 OLE DB ICommand 接口。由于这条限制，诸如文本文件之类的绑定表不受支持。

  • 应该对源、绑定表以及任何查找查询使用唯一的连接。

请参见

数据驱动的查询任务


增强 DTS 中的查找查询

当执行数据转换服务 (DTS) 的查找查询时，请考虑以下事项：

  • 当要查找的输入是外部值（例如，全局变量）时，DTS 查找可以被最好地使用。

  • 可以从转换函数中唤醒调用查找，这将允许将查询和连接与查找关联起来。在转换函数中，您就可以执行查询，并得到一个或更多个返回值。使用 COM 对象、VARIANT 以及 DTS GlobalVariable 集合，可以获得类似的功能。然而，Lookup 对象使用一个已建立的连接，并且已被优化为通过使用高速缓存获得快速的数据检索能力。

    如果此转换函数可以使用 SQL 语句代替查询（例如，一条带有联接子句的 SELECT 语句），则性能可以显著地提高。

  • 可以通过指定高速缓存的大小来配置查找查询以便高速缓存结果。如果高速缓存的大小大于零，那么查询的结果将按照参数值进行高速缓存。如果为查询再次提供相同的参数值，则从高速缓存返回结果而没有其它的数据库访问。当高速缓存装满时，将按照最近最少使用的次序删除行。

  • 查找查询连接必须能够支持 OLE DB ICommand 接口才能直接接受 SQL 语句。由于这种限制，不能将诸如文本文件之类的连接用于查找。

  • 如果任务联接包事务并且查找连接支持事务，则任何由查找查询所进行的更新也参与包事务。如果任务联接包事务并且查找连接不支持事务，对于回滚，查找所进行的更新将保留在文件上。

查找查询可能失败（例如，如果它试图插入一个带有重复键的行）。如果查找失败，则对源行不会做进一步的处理。查找失败在包含任务的 maximum errors 属性中计为一个错误。

请参见

查找查询