INF: DTS 包的开发、部署和性能

文章翻译 文章翻译
文章编号: 242391 - 查看本文应用于的产品
本文的发布号曾为 CHS242391
展开全部 | 关闭全部

本文内容

概要

本文旨在提供有关的详细信息,以协助进行 Data Transformation Services (DTS) 包的开发和部署。 此外,还提供某些改进包性能的提示。

更多信息

使数据连接功能灵活多变



DTS 包是一个完全自我包含的单元。 所有连接信息均在设计时读入连接属性集合,包括 UDL 和 ODBC DSN 中的连接信息。 如果在创建包后更改 ODBC DSN 或 OLEDB UDL,那么更改结果将不会对包造成影响。 试图将包从开发环境迁移到使用环境时,牢记这一点至关重要。

使用 SQL Server 数据连接时,请使用 (Local) 作为服务器名称,以便于在服务器之间移动包。这是因为将在包执行期间对服务器名称进行解析。 请注意,该方案要求在 SQL Server 计算机上编辑和运行该包。

也可使用 ActiveX 脚本任务或包装程序在运行时修改包属性。 若要通过包自身对包进行修改,请创建在数据抽取任务之前执行的 ActiveX 脚本任务,并在包运行期间对包进行修改。 若要获取包的句柄,请引用 DTSGlobalVariables.Parent。从中您可以更改任何包属性,尽管这需要一点编程技术。

以下是 SQL Books Online“ActiveX Script Tasks”主题中的一个示例,演示如何通过 ActiveX 脚本更改“数据源”(DataSource) 连接属性:
   Function main()
   dim oPackage
   dim oConn

     'Get package object
     set oPackage = DTSGlobalVariables.parent
     'Get a handle to the desired connection.
     set oConn = oPackage.connections(1)
     'Modify the datasource.
     oConn.datasource = "newServerName"

     'Release object handles.
     set oPackage = nothing
     set oPackage = nothing

    Main = DTSTaskExecResult_Success
End Function
如果希望加强控制而不介意更多的编码,可以考虑在包运行前用外部程序来修改包,或者从头开始创建新包。

若要创建一个程序来装载和修改包,请使用“DTS 向导”或“DTS 设计器”创建模板包,然后进行保存。 编写一个装载包并修改相关属性的 Visual Basic 程序,然后调用包对象上的 Execute 方法来运行包。

若要创建一个程序来从头生成包,请使用“DTS 向导”或“DTS 设计器”创建原型包,然后将其保存到本地 SQL Server 中。 使用下列 Microsoft Knowledge Base 文章中的 ScriptPkg 实用程序可以为包代码创建模板:
239454 INF: ScriptPkg Tool Generates DTS Object Model Code to Help Use DTS Programmatically
使用该模板作为参考,可以编写自己的代码以生成基于用户输入的包。

请注意:上述两种情况下,Visual Basic 项目需要引用 Microsoft DTSPackage 对象库。

重要说明: 当通过用 Visual Basic 语言编写的程序执行包并监控包或任务事件时,包中的所有步骤均须配置为在主线程上执行。 这是因为 Visual Basic 的限制会阻碍它正确处理对其事件的多个同步调用。

使用全局变量对包进行控制



全局变量仅能从 ActiveX 脚本任务、Workflow 脚本和 ActiveX 转换中使用。 它们无法直接用于 SQL 语句或连接属性中。 但是,ActiveX 脚本任务可基于全局变量来修改 SQL 语句或连接属性。 以下是 ActiveX 脚本任务的一个示例,它基于“booktype”全局变量来更改执行数据抽取任务的 SQL 语句:
Function main()
   dim oPackage
   dim oPump

        'Get a handle to the Package object.
	set oPackage = DTSGlobalVariables.Parent
	'Get a handle to the desired Datapump Task.
	set oPump = oPackage.Tasks("DTSTask_DTSDataPumpTask_1").CustomTask   
	'Alter the datapump SQL statement.
	oPump.SourceSQLStatement = "select * from pubs..titles WHERE type _
  = ''" + DTSGlobalVariables("booktype") + "''"
	Main = DTSTaskExecResult_Success
End Function
备注: 任务说明显示在 DTS 设计器中,但它无法直接引用 ActiveX 脚本中的任务。 应当使用任务名称引用 ActiveX 脚本中的任务。 若要获取任务名称,可查阅工作流属性中的步骤名。 任务名称与步骤名称类似,不同之处在于“Step”一词替换为“Task”。 例如,DTSStep_DTSDataPumpTask_1 变为 DTSTask_DTSDataPumpTask_1。

将参数传递到 DTS 包



DTSRun 程序不接受可在执行期间传递给包的任何命令行参数。 若要在运行时向包传递信息,则必须从文件中读取参数,或者以编程方式从数据库表中查询参数。

以下是 ActiveX 脚本任务的一个示例,其作用是从文本文件中读取一行以设置全局变量。 该全局变量随即用于修改包行为,如本文“用全局变量控制包”部分所示。
Function main()
  Dim fso	'This will serve as a handle to a file system object.
  Dim ofile	'Handle for accessing a file.

    'Get a file system object for manipulation files.
    Set fso = CreateObject("Scripting.FileSystemObject")

    'Open the text file.
    Set ofile = fso.OpenTextFile("c:\test.txt")

    'Read line from the file into the global variable.
    DTSGlobalVariables("myGlobalVar").Value = ofile.ReadLine

    'Close the "parameter" file.
    ofile.Close

    Main = DTSTaskExecResult_Success
End function
下例说明如何使用 ActiveX 脚本任务来读取 SQL Server 表中的参数。 这段代码将读取 my_param_table 中 paramvalue 列的值,然后用于设置全局变量。 本例使用 SQL 分布式管理对象 (DMO) 与 SQL Server 进行交互,但也可使用 ActiveX 数据对象 (ADO) 或其它数据访问方法完成同一任务。
Function main()
Dim oServer 		'DMO Server object.
Dim oResult		'Result set.
Dim sParamValue

	'Create a SQLDMO server object.
	Set oServer =  CreateObject("SQLDMO.SQLServer")

	' Make a connection to the local server.
	oServer.Connect ".", "sa"

	'Select the desired row from the table.
	set oResult = oServer.Databases("pubs").ExecuteWithResults_
("select  paramvalue from  my_param_table")

	'Retrieve the first row, first column from the results.
	sParamValue = oResult.GetColumnString (1,1)

	'Set the global variable.
	DTSGlobalVariables("MyGlobalVar").Value = sParamValue

	Main = DTSTaskExecResult_Success
End function

用 Visual Basic 编写自定义 DTS 任务



可以使用 Visual Basic 编写自定义 DTS 任务。 用 Visual Basic 编写的无用户接口自定义任务的示例,可以在 SQL Server 光盘的 \Devtools\Samples\DTS 目录中得到。 以下是处理自定义 Visual Basic DTS 任务时遇到的几个常见问题:
  1. 用 Visual Basic 编写的实现接口的自定义任务(如 DTS.CustomTaskUI)必须实现该接口的每个事件,否则就会引起“访问冲突”。
  2. 如果是开发带用户接口的 Visual Basic 自定义任务,建议采用 SQL Server Service Pack 1 (SP1)。 SP1 中组合了多个增强功能,以便于用户接口 (UI) 的开发。
  3. Visual Basic 任务是单元线程、而 DTS 是自由线程。 为了执行用 Visual Basic 编写的任务,必须在主线程上执行它,否则就会引起“访问冲突”。 默认情况下,DTS 将设置适当的标志。 用户不应当更改此标志。

获取有关如何对 DTS 包进行编码的信息



在 SQL 7.0 中,光盘的 \Devtools\Damples\DTS 文件夹中有几个样本示例。 其中包括一个“自定义任务” (Visual Basic) 样本和一个“自定义转换” (C++)。 另外,自解压可执行文件 DTSDemo.exe 中也有某些样本包。

最通用的示例是 ScriptPkg,它是 Dtsdemo.exe 的组成部分。 ScriptPkg 中包含 Visual Basic 源代码,可以将保存在本地服务器上的包转换为 Visual Basic 代码。 本示例最适用于下列情况:
  1. 通过编写现有 DTS 包的脚本来生成 Visual Basic 示例。
  2. 显示如何对 DTS 平面文件驱动程序(未包含在 SQL Books Online 中)进行编码。
  3. 将包转换为文本,从而可添加到 SourceSafe 中并进行跟踪。
以下是 ScriptPkg 示例的几个已知问题:
  1. 查询脚本编写不正确的数据抽取。
  2. 如果包太大,那么所生成的文本将无法作为 Visual Basic 的一个函数,因为函数的行数是有限制的。 您必须自己将脚本文件分解为多个函数,以使 Visual Basic 能对代码进行编译。

改进 DTS 包的性能



使用并行装载



DTS 可以并行运行多个任务。 但是,DTS 包中的每个连接一次只能处理一个线程。 这就意味着包中的下列数据抽取过程是以串行方式进行的:

A -> B and A -> B
A -> B and A -> C
A -> B and C -> B

是否对连接使用相同的图标(或不同的图标)没有什么不同。

使任务并行执行的唯一方式是使用不同的名称对同一数据库创建多个连接。 例如 A -> B 和 C -> D 将并行执行,即使 B 和 D 对于同一服务器和数据库是不同的连接。

过程约束可用于强制执行任务的执行顺序,而且在必要时可以防止所选任务的并行执行。

插入提交大小



数据抽取任务中最重要的参数是 Insert Commit Size。 该属性仅在目标是 SQL Server 时才有效。 它控制在提交事务前以大容量方式插入的行数。 默认情况下此参数为 0,即所有行均为单个事务的组成部分。 因为在遇到错误时 SQL Server 会回滚所有的更改,所以该设置最为安全。 不过,这时会需要非常大的事务日志,在取消包时导致响应时间延长,而在某个大装载任务的最后一行导致整个装载任务失败时还会降低效率。 在提交行时,每个提交间隔结束时会有一段明显的暂停。 提交大小为 0 时最快,但其它较为理想的值是 10,000、1000 和 1(速度依次降低)。 选择 1 比较好,因为在遇到故障时只回滚 1 行。

请注意:如果插入提交大小为 0,则将错误数设为大于 1 的值将没有任何作用。错误数是对错误的事务数(而非行数)的统计。

DTS 和分布式事务



DTS 包对支持 DTC 的提供程序提供分布式事务支持。 若想使包和步骤事务正常工作,DTC 服务必须处于运行状态。 此外,事务中的每个提供程序必须支持 DTC。

包事务的属性由包属性的 Advanced 选项卡控制。

默认情况下,包中的每一步均处理它自己的事务,而不会通过 DTC 进行事务协调。 若要登记 DTC 事务中的任务,则必须设置任务的工作流属性中的“有事务时联接”复选框。 任务的其它 DTC 事务选项包括“成功完成此步骤时提交事务”和“失败时回滚事务”。

请注意,包不支持 Microsoft Transaction Server (MTS)。

错误消息



如果使用“Local”作为数据库服务器名称以从包中进行连接,而该包随即又在另一个服务器上进行了编辑,而且另一个服务器上的人员还想查看转换结果,就会出现下列错误信息:
Error Source : Microsoft OLE DB Provider for SQL Server Error Description : Cannot open database requested in login 'xxxxxxx'. Login fails."

属性

文章编号: 242391 - 最后修改: 2004年3月10日 - 修订: 2.1
这篇文章中的信息适用于:
  • Microsoft SQL Server 7.0 标准版
  • Microsoft SQL Server 2000 标准版
关键字:?
kbinfo KB242391
Microsoft和/或其各供应商对于为任何目的而在本服务器上发布的文件及有关图形所含信息的适用性,不作任何声明。 所有该等文件及有关图形均"依样"提供,而不带任何性质的保证。Microsoft和/或其各供应商特此声明,对所有与该等信息有关的保证和条件不负任何责任,该等保证和条件包括关于适销性、符合特定用途、所有权和非侵权的所有默示保证和条件。在任何情况下,在由于使用或运行本服务器上的信息所引起的或与该等使用或运行有关的诉讼中,Microsoft和/或其各供应商就因丧失使用、数据或利润所导致的任何特别的、间接的、衍生性的损害或任何因使用而丧失所导致的之损害、数据或利润不负任何责任。

提供反馈

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com