Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Procedimientos Almacenados Extendidos
Procedimientos Almacenados Extendidos
Docente:
ING. GERMN NIO
Docente Ingeniera De Bases De Datos
Los procedimientos extendidos son implementados como libreras dinmicas (DLLs) por lo
general su nombre empieza con el prefijo xp_ por ejemplo xp_cmdshell. [3]
Usando Visual Studio y cualquiera de los lenguajes de la plataforma .NET (Visual C#, Visual
C++, Visual J# y Visual Basic) se pueden crear libreras (ficheros.DLL) que contengan
diferentes elementos entre ellos los Procedimientos Almacenados. [2]
Para implementar los procedimientos almacenados se debe Agregar y Registrar la DLL, para
esto existen 2 Formas:
TRANSACT-SQL
Para Crear el Ensamblado en SQL Server se utilizan las siguientes Sentencias:
CREATE ASSEMBLY [Nombre_SqlServerProject]
AUTHORIZATION [dbo]
FROM 'Ruta\fichero.DLL'
WITH PERMISSION_SET = SAFE
Este paso slo se debe hacer una vez en cada servidor de SQL Server Ahora ya podemos usar
los Procedimientos / Funciones que tengamos registrados.
EJEMPLOS
En este ejemplo se realiza una consulta a los Objetos de la Base de Datos , donde se pasa como
parmetro el Tipo de objetos que se quiere mostrar al usuario
CODIGO ENSAMBLADO
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Data;
using System.Data.SqlClient;
using System.Data.SqlTypes;
using Microsoft.SqlServer.Server;
while (Lector.Read())
{
Resultado.SetString(0, Lector.GetString(0));
SqlContext.Pipe.SendResultsRow(Resultado);
}
SqlContext.Pipe.SendResultsEnd();
conexion.Close();
Lector.Close();
}
CREAR ENSAMBLADO
Create assembly CalcularRegistros
FROM 'C:\Users\usuario\Copy\Sistemas
Operativos\Calcular_Registros\Calcular_Registros\bin\Debug\Calcular_Registros.dll'
WITH PERMISSION_SET=SAFE
GO
REGISTRAR PROCEDMIENTO
GO
EJECUCIN PROCEDIMIENTO
En este Ejemplo se trabajara con la Base de datos Ejemplos, donde se toma los datos de la
Tabla Sueldo_Empleados y se realizara una operacin matemtica para calcular el Sueldo a
pagar por cada Empleado segn el Sueldo Base, el porcentaje de subsidio y el porcentaje de
Descuento donde estos 2 ultimo los recibe como parametros.
CODIGO ENSAMBLADO
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Data;
using System.Data.SqlTypes;
using System.Data.SqlClient;
using Microsoft.SqlServer.Server;
conexion.Open();
while (Total_Sueldo.Read())
{
Resultado.SetInt32(0, Total_Sueldo.GetInt32(0));
Resultado.SetInt32(1, Total_Sueldo.GetInt32(1));
Resultado.SetInt32(2, ((Total_Sueldo.GetInt32(1) * Subsidio) /
100) + Total_Sueldo.GetInt32(1));
}
SqlContext.Pipe.SendResultsEnd();
conexion.Close();
Total_Sueldo.Close();
CREAR ENSAMBLADO
CREATE ASSEMBLY CalcularSueldo
FROM 'C:\Users\usuario\Copy\Sistemas
Operativos\CalcularSueldo\CalcularSueldo\bin\Debug\CalcularSueldo.dll'
WITH PERMISSION_SET = SAFE
GO
REGISTRAR PROCEDMIENTO
Create Procedure Calcular
@Subsidio integer,
@Porcentaje_Descuento integer
with execute as caller
as external name CalcularSueldo.CalcularSueldo.Calcular_Sueldo
GO
EJECUCIN PROCEDIMIENTO
exec calcular 100,2
EJEMPLO #3
En este Ejemplo se trabajara con la Base de datos Ejemplos, donde se Insertara Registros a la
Tabla Empleados desde el Procedimiento Almacenado, recibiendo como parmetros los datos
del Nuevo Registro
CODIGO ENSAMBLADO
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Microsoft.SqlServer.Server;
using System.Data.SqlClient;
using System.Data.SqlTypes;
using System.Data;
using System.IO;
[Microsoft.SqlServer.Server.SqlProcedure]
public static void Inserta(int Cedula, string Nombre, string Apellido)
{
try
{
conexion.Open();
comando.ExecuteNonQuery();
}
catch (SqlException ex)
{
SqlContext.Pipe.Send("Error" + ex);
finally
{
conexion.Close();
CREAR ENSAMBLADO
CREATE ASSEMBLY Insertar
FROM 'C:\Users\usuario\Copy\Sistemas
Operativos\Insertar_Datos\Insertar_Datos\bin\Debug\Insertar_Datos.dll'
WITH PERMISSION_SET=SAFE
GO
REGISTRAR PROCEDMIENTO
CREATE PROCEDURE Insertar_Datos
@Cedula int,
@Nombre nvarchar(50),
@Apellido nvarchar(50)
with execute as caller
as external name Insertar.Insertar_Datos.Inserta
GO
EJECUCIN PROCEDIMIENTO
Exec Insertar_Datos 1024493360,'Camilo','Prueba'
CONCLUSIONES
REFERENCIAS
http://msdn.microsoft.com/es-es/library/ms345106.aspx [1]
http://msdn.microsoft.com/es-es/library/ms131094.aspx [2]
ftp://ftp.heanet.ie/mirrors/sourceforge/t/te/technicaldocs/PDF/CLR.pdf [3]
http://msdn.microsoft.com/es-es/library/ms131092.aspx [4]