INF: Desarrollo, implementación y rendimiento de los paquetes DTS

Seleccione idioma Seleccione idioma
Id. de artículo: 242391 - Ver los productos a los que se aplica este artículo
Expandir todo | Contraer todo

En esta página

Resumen

El propósito de este artículo es proporcionar información detallada que ayude al desarrollo e implementación de los paquetes de Servicios de transformación de datos (DTS) de SQL Server 7.0. También proporciona sugerencias para mejorar el rendimiento del paquete.

Para obtener información sobre este tema en SQL Server 2000, consulte Libros en pantalla de SQL Server.

Más información

Flexibilizar las conexiones de datos

Un paquete DTS es una unidad totalmente autónoma. Toda la información de la conexión se encuentra en la colección de propiedades de la conexión en el momento del diseño, incluso la información de conexión de los UDL y los DSN de ODBC. Si cambia el DSN de ODBC o el UDL de OLEDB después de crear el paquete, ese cambio no surte efecto en el paquete. Es importante recordar este hecho cuando intente migrar paquetes desde un entorno de desarrollo a otro de producción.

Cuando utilice conexiones de datos de SQL Server, use (Local) para el nombre del servidor, para que sea más fácil mover el paquete de servidor a servidor, pues el nombre del servidor se resuelve en el tiempo de ejecución del paquete. La única salvedad de este enfoque es que requiere que el paquete se ejecute y modifique en el propio equipo de SQL Server.

También puede usar una tarea Secuencia de comandos ActiveX o un programa contenedor para modificar las propiedades del paquete en tiempo de ejecución. Para modificar el paquete desde dentro, cree una tarea Secuencia de comandos de ActiveX que preceda a las tareas de bombeo de datos y modifique el paquete mientras se ejecuta. Para obtener un control del paquete la referencia es DTSGlobalVariables.Parent. Desde ahí podrá cambiar cualquiera de las propiedades del paquete, aunque eso requiere un poco de habilidades de programación.

A continuación se incluye un ejemplo extraído del tema que trata las tareas Secuencia de comandos de ActiveX de Libros en pantalla de SQL, para saber cómo cambiar la propiedad de conexión DataSource con una secuencia de comandos ActiveX:
   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 oConn = nothing

    Main = DTSTaskExecResult_Success
End function
				
Si desea más control y no le importa incluso un poco más de codificación, considere la modificación del paquete con un programa externo antes de ejecutar o crear el paquete desde cero.

Para crear un programa para cargar y modificar un paquete, cree el paquete de plantilla utilizando el Asistente para DTS o el Diseñador DTS y guárdelo. Escriba un programa de Visual Basic que cargue el paquete y lo modifique las propiedades deseadas y, después, llame al método Execute en el objeto del paquete para ejecutar el paquete.

Para crear un programa para generar un paquete desde cero, cree un paquete prototipo utilizando el Asistente para DTS o el Diseñador DTS y guárdelo en el equipo SQL Server local. Use la utilidad ScriptPkg del siguiente artículo de Microsoft Knowledge Base para crear una plantilla para el código del paquete:
239454 INF: La herramienta ScriptPkg genera código del modelo de objetos de DTS para ayudar a utilizar DTS mediante programación
Con esta plantilla como referencia, escriba su propio código para generar un paquete basándose en las entradas de usuario.

Tenga en cuenta que para las dos situaciones anteriores, el proyecto de Visual Basic necesita tener una referencia a la Biblioteca de objetos Microsoft DTSPackage.

IMPORTANTE: cuando ejecute un paquete desde un programa escrito en Visual Basic y supervise los eventos de tareas y el paquete, todos los pasos del paquete se debe configurar para ejecutarse en el subproceso principal. Se debe a una limitación de Visual Basic que le impide controlar adecuadamente varias llamadas simultáneas a sus eventos.

Control de paquetes con variables globales

Las variables globales solamente son accesibles desde las tareas de secuencia de comandos ActiveX, las de flujo de trabajo y las transformaciones de ActiveX. No se pueden usar directamente en las propiedades de conexión o las instrucciones SQL. Sin embargo, se puede usar una tarea de secuencias de comandos de ActiveX para modificar las propiedades de conexión o la instrucción SQL basándose en una variable global. Se incluye aquí un ejemplo de tarea de secuencia de comandos de ActiveX que puede usarse en la instrucción SQL para una tarea de bombeo de datos basada en la variable global llamada 'booktype':
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
				
NOTA: La descripción de una tarea se muestra en el Diseñador DTS, pero no se puede usar como una referencia directa a una tarea de secuencias de comandos de ActiveX. El nombre de la tarea debería usarse como una referencia a la tarea desde una secuencia de comandos de ActiveX. Para obtener el nombre de la tarea, vea las propiedades del flujo de trabajo para el nombre del paso. El nombre de la tarea es el mismo que el del paso, salvo que el nombre 'Step' es sustituido por el nombre 'Task'. Por ejemplo, DTSStep_DTSDataPumpTask_1 se convierte en DTSTask_DTSDataPumpTask_1.

Pasar parámetros a un paquete DTS

El programa DTSRun no acepta parámetros de la línea de comandos que se puedan pasar al paquete en tiempo de ejecución. Para pasar información a un paquete en tiempo de ejecución, los parámetros deben ser leídos desde un archivo o consultados mediante programa desde una tabla de base de datos.

NOTA: si las herramientas de SQL Server 2000 o una instancia con nombre de SQL Server 2000 están en un equipo con SQL Server 7.0 instalado como la instancia predeterminada, el programa DTSRun puede aceptar que el programa de línea de comandos /A pase los valores desde la línea de comandos a las variables globales definidas en un Paquete DTS de SQL Server 7.0.

Se incluye aquí un ejemplo de una tarea Secuencia de comandos de ActiveX que lee una línea desde un archivo de texto para establecer una variable global. Esta variable global podrá usarse entonces para modificar el comportamiento del paquete, tal como se muestra en la sección "Control de paquetes con variables globales" de este artículo.
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
				
El ejemplo siguiente muestra cómo usa una tarea de secuencias de comandos de ActiveX para leer parámetros desde una tabla de SQL Server. El código lee el valor de la columna paramvalue en la tabla my_param_table y lo usa para configurar una variable global. Este ejemplo usa objetos de administración distribuidos (DMO) de SQL para interactuar con SQL Server, pero puede conseguir lo mismo utilizando ActiveX Data Objects (ADO) u otro método de acceso a datos.
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
				

Escribir tareas personalizadas de DTS en Visual Basic

Es posible escribir tareas personalizadas de DTS en Visual Basic. Un ejemplo de tarea personalizada en Visual Basic sin una IU está disponible en el directorio \Devtools\Samples\DTS del CD-ROM de SQL Server. Se incluyen a continuación varios problemas comunes que se encuentran al tratar tareas personalizadas de Visual Basic en DTS:
  1. Las tareas personalizadas de Visual Basic, que implementan una interfaz como DTS.CustomTaskUI, DEBEN implementar todos los eventos de la interfaz para no provocar una infracción de acceso.
  2. Si está desarrollando una tareas personalizada de Visual Basic con una IU, se recomienda que aplique SQL Server Service Pack 1 (SP1). El SP1 incorpora varias mejoras que facilitan el desarrollo de la IU.
  3. Las tareas de Visual Basic son subprocesos de tipo apartamento, mientras que DTS es un subproceso de forma libre. Para ejecutar una tarea escrita en Visual Basic, lo debe hacer en el subproceso principal para no causar una infracción de acceso. DTS establece de manera predeterminada el indicador apropiado. El usuario no debe cambiar este indicador.

Obtener información acerca del modo de codificar paquetes DTS

En el CD-ROM de SQL 7.0 hay varios ejemplos bajo la carpeta \Devtools\Damples\DTS. Incluyen un ejemplo de tarea personalizada (Visual Basic) y uno de transformación personalizada (C++). También hay algunos paquetes de ejemplo en el ejecutable autoextraíble DTSDemo.exe.

El ejemplo más versátil es ScriptPkg, que forma parte de Dtsdemo.exe. ScriptPkg contiene el código fuente de Visual Basic que convierte un código de Visual Basic un paquete guardado en el servidor local. Este ejemplo es conveniente usarlo para:
  1. Producir ejemplos de Visual Basic mediante las secuencias de comando de un paquete DTS existente.
  2. Mostrar cómo codificar el controlador flatfile de DTS, que no está documentado en los Libros en pantalla de SQL.
  3. Convertir un paquete en texto para que se pueda agregar a SourceSafe y realizar su seguimiento.
Se incluyen a continuación varios problemas conocidos del ejemplo de ScriptPkg:
  1. Búsquedas de un bombeo de datos cuyas secuencias de comando no son correctas.
  2. Si el paquete es demasiado grande, no se puede tratar el texto generado como una función de Visual Basic por causa de una limitación en el número de líneas de una función. Tiene que subdividir por su cuenta el archivo de secuencias de comandos en varias funciones para que Visual Basic pueda compilar el código.

Mejorar el rendimiento del paquete DTS

Utilizar cargas paralelas

DTS puede ejecutar varias tareas en paralelo. Sin embargo, cada conexión de un paquete DTS solamente puede controlar un subproceso cada vez. Eso significa que los siguientes bombeos de datos de un paquete están todos serializados.

A -> B y A -> B
A -> B y A -> C
A -> B y C -> B

El hecho de que para la conexión use o no los mismos iconos u otros diferentes no significa diferencia alguna.

La única manera de obtener la ejecución en paralelo de las tareas es crear conexiones múltiples con nombres diferentes a la misma base de datos. Por ejemplo, A -> B y C -> D se ejecutan en paralelo incluso si B y D son conexiones diferentes al mismo servidor y base de datos.

Se pueden usar limitaciones de precedencia para forzar el orden de ejecución de las tareas e impedir según sea necesario que se realicen en paralelo las tareas seleccionadas.

Tamaño de confirmación de inserción

El parámetro más importante de la tarea de bombeo de datos es el Tamaño de confirmación de inserción. Esta propiedad solamente es relevante cuando el destino es SQL Server. Controla cuántas filas son afectadas por una inserción masiva antes de que la transacción sea confirmada. De manera predeterminada es 0; todas las filas forman parte de una sola transacción. Esta es la confirmación más segura, pues ante cualquier error SQL Server deshace todos los cambios. Sin embargo, puede requerir un registro de transacción muy grande, causando un tiempo de respuesta muy largo cuando un paquete es cancelado, además de resultar contraproducente si una sola fila del final de una carga grande provoca el error de la carga completa. Se puede percibir una pausa al final de cada intervalo de confirmación, mientras las filas son confirmadas. Un tamaño de confirmación de 0 es el más rápido, pero otros valores buenos son 10.000, 1.000 y 1 en orden de velocidad decreciente. 1 es útil, porque cualquier error solamente deshace una fila.

Tenga en cuenta que configurar la cuenta de errores en cualquier número > 1 no produce efecto alguno si el tamaño de confirmación de inserción es 0. La cuenta de errores cuenta el número de transacciones con errores, no el número de filas.

En SQL Server 7.0, puede configurar el valor Tamaño de confirmación de inserción de la sección Movimiento de datos de la ficha Avanzadas de las propiedades de la tarea Transformar datos.

DTS y las transacciones distribuidas

Los paquetes DTS proporcionan soporte a las transacciones distribuidas para aquellos proveedores que dan soporte a DTC. Para que el paquete y las transacciones de paso funcionen debe estar ejecutándose el Servicio DTC. Además, cada proveedor de la transacción debe ser compatible con DTC.

Las propiedades de la transacción de paquete se controlan en la ficha Avanzadas de las propiedades de paquete.

De manera predeterminada, cada paso de un paquete controla sus propias transacciones y no las coordina mediante DTC. Para enumerar una tarea en una transacción DTC, debe configurar la casilla de verificación "Combinar transacción, si está presente" en las propiedades de flujo de trabajo de la tarea. Otras propiedades de la transacción DTC de una tarea son "Confirmar la transacción al completar correctamente este paso" y "Deshacer la transacción en caso de error".

Tenga en cuenta que los paquetes no son compatibles con Microsoft Transaction Server (MTS).

Mensaje de error

Cuando usa Local en el servidor de base de datos para una conexión desde un paquete y el paquete es modificado después desde otro servidor, y esa persona quiere ver las transformaciones, se devuelve el mensaje de error siguiente:
Origen del error: Proveedor Microsoft OLE DB para SQL Server Descripción del error: No se puede abrir la base de datos solicitada en el inicio de sesión ''xxxxxxx''. Error de inicio de sesión."

Propiedades

Id. de artículo: 242391 - Última revisión: lunes, 28 de enero de 2008 - Versión: 1.0
La información de este artículo se refiere a:
  • Microsoft SQL Server 7.0 Standard Edition
Palabras clave: 
kbinfo KB242391

Enviar comentarios

 

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