You are on page 1of 12

Ingeniera De Bases De Datos

Camilo Alberto Prieto

Docente:
ING. GERMN NIO
Docente Ingeniera De Bases De Datos

Universidad Manuela Beltrn


Ingeniera de Sistemas
Bogot
2014

TABLA DE CONTENIDO
Introduccin a los Procedimientos Almacenados ........................................................................................... 3
Procedimientos almacenados extendidos .......................................................................................................... 3
Registro y uso de procedimientos .net con clr en sql server ................................................................. 3
Ejemplos ........................................................................................................................................................................... 5
Ejemplo #1 ............................................................................................................................................................. 6
Ejemplo #2 ............................................................................................................................................................. 8
Ejemplo #3 .......................................................................................................................................................... 10
Conclusiones ................................................................................................................................................................ 12
Referencias ................................................................................................................................................................... 12

INTRODUCCIN A LOS PROCEDIMIENTOS ALMACENADOS

Un procedimiento almacenado es un pequeo programa almacenado en la base de datos que


puede ser ejecutado en cualquier momento. Los procedimientos almacenados, utilizan un
lenguaje propietario ya que el estndar SQL ANSI 92 no especifica nada acerca de ellos.

PROCEDIMIENTOS ALMACENADOS EXTENDIDOS


Los Procedimientos almacenados extendidos permiten crear Rutinas Externas propias en un
lenguaje de Programacin como c#, vb, c++etc. , estos procedimientos se muestran ante los
usuarios como procedimientos almacenados Normales y se ejecutan del mismo modo, estos
procedimientos extendidos son (.DLL) que contienen mdulos (Ensamblados) de Cdigo
Objeto llamado cdigo MSIL (Nicrosoft Intermediate Language).Este es un cdigo
Multiplataforma, Independiente del procesador y Sistema operativo, que requiere ser
compilado al Vuelo cuando se quiere ejecutar. Para esta tarea, SQL Server incluye en su ncleo
el Compilador JIT (Just in-time), que es la base del CLR(Common Language Runtime).
Los procedimientos extendidos son implementados como libreras dinmicas (DLLs) por lo
general su nombre empieza con el prefijo xp_ por ejemplo xp_cmdshell. [3]

REGISTRO Y USO DE PROCEDIMIENTOS .NET CON CLR EN SQL SERVER


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

INTERFAZ GRAFICA SQL SERVER MANAGEMENT


Otra forma para crear el Ensamblado no la brinda la interfaz Grfica del Administrador de SQL
Server
Presionamos Clic en: BBDD Programacin Ensamblados Botn Derecho Nuevo
Ensamblado...
Presionamos Clic en el botn Examinar y seleccionamos el <fichero.DLL> en la ubicacin
donde este.

REGISTRO DE PROCEDIENTOS ALMACENADOS


El siguiente paso es Registrar los Procedimientos Almacenados, para esto utilizamos
TRANSACT-SQL con las siguientes sentencias:

CREATE PROCEDURE [dbo].[Nombre]


@Parametro1 [TipoDato],
@Parametro2 [TipoDato],
@Parametron [TipoDato]
WITH EXECUTE AS CALLER
AS EXTERNAL NAME
[Nombre Ensamblado].[Nombre Clase].[Nombre Procedimiento/Funcin del
Ensamblado ]

Se debe realizar un CREATE por cada Procedimiento o Funcin del Ensamblado.

EJECUCION DE PROCEDIENTOS ALMACENADOS


Para la ejecucin del Procedimiento utilizamos la Siguiente Sentencia:
Exec [Nombre Procemiento] Parametro1, Parametro1, ParametroN

Al ejecutar el procedimiento Extendido nos informara que no tenemos habilitada la ejecucin


de cdigo de usuario en .NET Framework:

La ejecucin de cdigo de usuario en .NET Framework est deshabilitada. Habilite la opcin


de configuracin "clr enabled".

HABILITAR LA INTEGRACIN CLR


Para habilitar la Integracin CLR utilizamos la Siguiente Sentencia:
Exec sp_configure 'clr enabled', 1

Nos arrojara el siguiente Mensaje:


Se ha cambiado la opcin de configuracin 'clr enabled' de 0 a 1. Ejecute la instruccin
RECONFIGURE para instalar.
En la Consulta ejecutamos: RECONFIGURE
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
Para el desarrollo de los ejemplos vamos a utilizar C# y la siguiente Base de Datos
create database Ejemplos
go
use Ejemplos
go
Create table Empleados
(
Identificacion Integer Not null,
Nombre Varchar(30) Not Null,
Apellido Varchar(30) Not null,
Primary Key (Identificacion)
)
go
Create Table Sueldos_Empleados
(
Identificacion Integer Not Null,
Sueldo_Base Integer Not Null
Foreign key (Identificacion) References Empleados(Identificacion)
)
go
delete from Empleados
Insert Into Empleados values(1024493356,'Camilo','Prieto')
Insert Into Empleados values(1024493222,'Alberto','Rodriguez')
go
delete from Sueldos_Empleados
Insert Into Sueldos_Empleados values(1024493356,1000000)
Insert Into Sueldos_Empleados values(1024493222,2000000)

EJEMPLO #1
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
using
using
using
using
using
using
using
using

System;
System.Collections.Generic;
System.Linq;
System.Text;
System.Threading.Tasks;
System.Data;
System.Data.SqlClient;
System.Data.SqlTypes;
Microsoft.SqlServer.Server;

public class Calcular


{
public static void Calcular_Registros(string Tipo)
{
SqlConnection conexion = new SqlConnection("context connection=true");
SqlCommand comando = conexion.CreateCommand();
comando.CommandText = "SELECT name FROM SYSOBJECTS WHERE TYPE = '" + Tipo +
"'";
conexion.Open();
SqlDataReader Lector = comando.ExecuteReader();
SqlDataRecord Resultado = new SqlDataRecord(new SqlMetaData("Tabla",
SqlDbType.Text));
SqlContext.Pipe.SendResultsStart(Resultado);

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
Create Procedure Registros
@Tipo nvarchar (3)
WITH EXECUTE AS CALLER
AS EXTERNAL name CalcularRegistros.Calcular.Calcular_Registros
GO

EJECUCIN PROCEDIMIENTO
exec Registros 'U'

EJEMPLO #2
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
using
using
using
using
using
using
using
using

System;
System.Collections.Generic;
System.Linq;
System.Text;
System.Threading.Tasks;
System.Data;
System.Data.SqlTypes;
System.Data.SqlClient;
Microsoft.SqlServer.Server;

public class CalcularSueldo


{
[Microsoft.SqlServer.Server.SqlProcedure()]
public static void Calcular_Sueldo(int Subsidio,int Porcentaje_Descuento)
{
SqlConnection conexion = new SqlConnection("context connection=true");
SqlCommand comando = conexion.CreateCommand();
comando.CommandText = "Select * from Sueldos_Empleados";
conexion.Open();
SqlDataReader Total_Sueldo = comando.ExecuteReader();
SqlDataRecord Resultado = new SqlDataRecord(new
SqlMetaData("Identificacion", SqlDbType.Int), new SqlMetaData("Sueldo_Base",
SqlDbType.Int), new SqlMetaData("Sueldo_Total", SqlDbType.Int));
SqlContext.Pipe.SendResultsStart(Resultado);
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
using
using
using
using
using
using
using
using
using

System;
System.Collections.Generic;
System.Linq;
System.Text;
System.Threading.Tasks;
Microsoft.SqlServer.Server;
System.Data.SqlClient;
System.Data.SqlTypes;
System.Data;
System.IO;

public class Insertar_Datos


{

[Microsoft.SqlServer.Server.SqlProcedure]
public static void Inserta(int Cedula, string Nombre, string Apellido)
{
SqlConnection conexion = new SqlConnection("context connection=true");
SqlCommand comando = conexion.CreateCommand();
comando.CommandText = "Insert Into Empleados Values
(@Identificacion,@Nombre,@Apellido)";

comando.Parameters.Add("@Identificacion", SqlDbType.Int).Value = Cedula


;
comando.Parameters.Add("@Nombre", SqlDbType.NVarChar, 30).Value =
Nombre;
comando.Parameters.Add("@Apellido", SqlDbType.NVarChar, 30).Value =
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

Transact-SQL est diseado especficamente para el acceso directo a los datos y la


manipulacin de la base de datos. Aunque Transact-SQL destaca en el acceso y administracin
de datos, no es un lenguaje de programacin completo. Por ejemplo, Transact-SQL no admite
matrices, colecciones, bucles for-each, desplazamiento bit a bit o clases. Aunque algunas de
estas construcciones se pueden simular en Transact-SQL, el cdigo administrado tiene
compatibilidad integrada para estas construcciones. Dependiendo de la situacin, estas
caractersticas pueden proporcionar una razn de peso para implementar cierta
funcionalidad de base de datos en el cdigo administrado.

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]

You might also like