sábado, 10 de mayo de 2008

Lo prometido es deuda!!

Tal como se los dije en el post anterior, en este hablaré de como invocar un paquete de SQL Server 2005 Integration Services, pero cuando el paquete está guardado en el Engine de SQL Server.

Paso #1 Importar el Siguiente Assembly

Microsoft.SqlServer.Dts.Runtime, para ello hay que agregar las siguientes referencias:



Paso #2 Importar las siguientes librerias:

using Microsoft.SqlServer.Dts;
using Microsoft.SqlServer.Dts.Runtime;
using Microsoft.SqlServer.Dts.Runtime.Wrapper;

El método a utilizar es Application.LoadFromDtsServer, que recibe (en este mismo orden) los siguientes parametros,

1) Nombre del Paquete -> de tipo String
2) Nombre del Servidor -> de tipo String
3) Eventos -> Clase Events, pero este parametro es opcional, en el ejemplo que se ilustra, se le envia el valor null.

public string EjecutarPaqueteSSIS(String NombreServidor, String NombrePaquete, int AlgunValor)
{
try
{
Microsoft.SqlServer.Dts.Runtime.DTSExecResult Results;

Microsoft.SqlServer.Dts.Runtime.Application app =
new Microsoft.SqlServer.Dts.Runtime.Application();

Microsoft.SqlServer.Dts.Runtime.Package package =
(Microsoft.SqlServer.Dts.Runtime.Package)
app.LoadFromDtsServer(NombrePaquete, NombreServidor, null);

Variables vars = package.Variables;
vars["NombreVariable"].Value = AlgunValor;

Results = package.Execute();

return Results.ToString();
}
catch (Exception ex)
{
return ex.ToString();
}
}

OK, y este es todo el camino para invocar un paquete de Integration Services 2005 guardado en el Motor de SQL Server.

Nos vemos en el proximo Post.

Saludos,

LeonelJ

martes, 6 de mayo de 2008

Invocar un paquete de SQL Server Integration Services 2005

Algo que suele presentarse muy frecuentemente es el tener que invocar un paquete de SQL Server Integration Services por programación, en este caso yo seleccioné Visual C#, mi caballito de batallas, aquí se detalla un método, ideal para cuando se guarda el paquete como sistema de archivos (*.dtsx). En el proximo post mostraré como hacerlo si se guarda el paquete en SQL Server.

En primer lugar es necesario habilitar la caracteristica xp_cmdshell, ya que con ella se va a ejecutar el paquete con la utilidad dtexec, (Antiguo dtsrun en SQL Server 2000) como si se estuviera en la linea de comandos. Esta actividad se hace por medio del SQL Server Surface Area Configuration.



El siguiente paso es ir a "Surface Area Configuration for Features" y habilitar el caracteristica mencionada (xp_cmdshell):



La continuación es crear un Stored Procedure que haga uso de xp_cmdshell:

CREATE PROCEDURE usp_CorrerPaqueteSSIS
@Comando VARCHAR(8000)
AS
DECLARE @returncode INT
EXEC @returncode = xp_cmdshell @Comando
RETURN @returncode


OK, hasta aqui se tiene toda la estructura de ejecución, pero la gran pregunta: "Y que valor se le manda al parametro @Comando?"...

La Respuesta: una cadena que cumpla con la siguiente sintaxis:

dtexec /f "[Ruta del Archivo]" /De [Clave de Cifrado]

dtexec /f "C:\Pruebas\Paquete1.dtsx" /De Pa$$w0rd

/f indica que el paquete fue guardado en Sistema de Archivos

/De es el atributo que indica el password con el cual fue cifrada la data critica del paquete (El Password del Connection String)

Finalmente el codigo C# con el cual se llama al Stored Procedure, aclaro que este codigo no esta basado en las mejores prácticas, esto simplemente ilustra como invocar a usp_CorrerPaqueteSSIS:

private int InvocarPaquete(string Ruta, string Password)
{
int resultado;
string parametro = "dtexec /f " + Ruta + " /De " + Password;
string connStr =
"Server=(local); Database=Pruebas; uid=usuario; pwd=password;";
SqlConnection conexion = new SqlConnection(connStr);
conexion.Open();
SqlCommand comando = new SqlCommand("usp_CorrerPaqueteSSIS", conexion);
comando.CommandType = CommandType.StoredProcedure;
comando.Parameters.Add(new SqlParameter("@Comando", parametro));
resultado = comando.ExecuteScalar();
return resultado;
}


Un pequeño detalle, el usuario que se utilice en el connection string debe estar en el esquema "sys" de la base de datos, de lo contrario todo esto resultará en un SqlException.

Ya para finalizar con este post, si el paquete recibe parámetros (Variables, ó Variables Globales como se llamaban en SQL Server 2000), a la sintaxis del comando hay que agregarle lo siguiente:

dtexec /f "[Ruta del Archivo]" /De [Clave de Cifrado] /SET \package\DataFlowTask.Variables[User::NombreVariable].Value;Valor

La diferencia esta en el atributo /SET.

Nos vemos en el proximo post.

Saludos,

Leonel J

Migrar de SQL Server 2000 a 2005 con Detach y Attach!!

Hola estimado lector, en este pequeño post, se muestra como llevar una base de datos desde SQL Server 2000 a SQL Server 2005, a través de un Detach & Attach...

El siguiente script ya fue probado en una Virtual PC con Windows Server 2003 R2 SP1, SQL Server 2000 Developer Edition y SQL Server 2005 Developer Edition, la base de datos fue Stores

1) Correr desde SQL Server 2000 (Query Analyzer) el Stored Procedure sp_detach_db:

USE master;
GO
EXEC sp_detach_db @dbname = N'Stores';
GO


2) Crear en SQL Server 2005 la base de datos en activando la opción Atach, esto es un CREATE DATABASE común y corriente:

USE master;
GO
CREATE DATABASE Stores
ON PRIMARY
(FILENAME = 'C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\Data\Stores.mdf') LOG ON (FILENAME = 'C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\Data\Stores_log.ldf')
FOR ATTACH;
GO


3) Correr desde SQL Server 2005 el Stored Procedure sp_attach_db:

USE master;
GO
EXEC sp_attach_db @dbname = N'Stores',
@filename1 = N'C:\Program Files\Microsoft SQL Server\MSSQL\Data\Stores.mdf', @filename2 = N'C:\Program Files\Microsoft SQL Server\MSSQL\Data\Stores_log.ldf';
GO

Algo para tener en cuenta: Es ALTAMENTE recomendable (para no decir obligatorio, jejejeje) que se ejecute la sentencia DBCC UPDATEUSAGE, ya que algunas páginas (las tablas de SQL Server se componen de páginas), índices o particiones podrían quedar corruptas. Acá la documentación de ella: http://msdn.microsoft.com/en-us/library/ms188414.aspx, finalmente, para no tener problemas de inconsistencia con la metadata, se recomienda visitar este link, porque quizá (no siempre pasa, pero Murphy anda suelto) se tenga que crear nuevamente, ya que hubo cambio de versión en la DB. Acá la documentación: http://msdn.microsoft.com/en-us/library/ms187580.aspx

Ah, casi lo olvido, estas dos últimas tareas lo más recomendable es que la ejecute la figura del DBA.... Nadie conoce el servidor de bases de datos mejor que el :-)

Saludos,

Nos vemos en el proximo Post!!