Share via


Introducción a la integración CLR

En este tema se proporciona información general sobre los espacios de nombres y bibliotecas que son necesarios para compilar objetos de base de datos mediante la integración de Microsoft SQL Server con .NET Framework Common Language Runtime (CLR). En este tema también se muestra cómo escribir, compilar y ejecutar un procedimiento almacenado CLR simple escrito en Microsoft Visual C#.

Espacios de nombres necesarios

A partir de SQL Server 2005, los componentes necesarios para desarrollar objetos de base de datos CLR básicos se instalan con SQL Server. La funcionalidad de la integración CLR se expone en un ensamblado denominado system.data.dll, que forma parte de .NET Framework. Este ensamblado puede encontrarse en la caché de ensamblados global (GAC) o en el directorio de .NET Framework. Normalmente, se agrega una referencia a este ensamblado mediante las herramientas de la línea de comandos y Microsoft Visual Studio, por lo que no es necesario agregarla manualmente.

El ensamblado system.data.dll contiene los espacios de nombres siguientes, que son necesarios para compilar objetos de base de datos CLR:

System.Data

System.Data.Sql

Microsoft.SqlServer.Server

System.Data.SqlTypes

Escribir un procedimiento almacenado "Hello World" simple

Copie y pegue el siguiente código de Visual C# o Microsoft Visual Basic en un editor de texto y guárdelo en un archivo denominado "helloworld.cs" o "helloworld.vb".

using System;
using System.Data;
using Microsoft.SqlServer.Server;
using System.Data.SqlTypes;

public class HelloWorldProc
{
    [Microsoft.SqlServer.Server.SqlProcedure]
    public static void HelloWorld(out string text)
    {
        SqlContext.Pipe.Send("Hello world!" + Environment.NewLine);
        text = "Hello world!";
    }
}
Imports System
Imports System.Data
Imports Microsoft.SqlServer.Server
Imports System.Data.SqlTypes
Imports System.Runtime.InteropServices
 
Public Class HelloWorldProc
    <Microsoft.SqlServer.Server.SqlProcedure> _ 
    Public Shared  Sub HelloWorld(<Out()> ByRef text as String)
        SqlContext.Pipe.Send("Hello world!" & Environment.NewLine)
        text = "Hello world!"
    End Sub
End Class

Este programa simple contiene un solo método estático en una clase pública. Este método usa dos clases nuevas, SqlContext y SqlPipe, para crear los objetos de base de datos administrados a fin de generar un mensaje de texto simple. El método también asigna la cadena "Hello world!" como valor de un parámetro de salida. Este método puede declararse como un procedimiento almacenado en SQL Server y, a continuación, ejecutarse del mismo modo que un procedimiento almacenado de Transact-SQL.

Ahora, procederemos a compilar este programa como una biblioteca, lo cargaremos en SQL Server y lo ejecutaremos como un procedimiento almacenado.

Compilar el procedimiento almacenado "Hello World"

SQL Server instala los archivos de redistribución de Microsoft .NET Framework de forma predeterminada. Estos archivos incluyen csc.exe y vbc.exe, los compiladores de línea de comandos de Visual C# y Visual Basic. Para compilar el ejemplo, debe modificar la variable de ruta de acceso para que apunte al directorio que contiene los archivos csc.exe o vbc.exe. Ésta es la ruta de instalación predeterminada de .NET Framework.

C:\Windows\Microsoft.NET\Framework\(version)

La versión incluye el número de versión del componente .NET Framework redistribuible instalado. Por ejemplo:

C:\Windows\Microsoft.NET\Framework\v2.0.31113

Una vez agregado el directorio .NET Framework a la ruta de acceso, puede compilar el procedimiento almacenado de ejemplo en un ensamblado con el siguiente comando. La opción /target permite compilarlo en un ensamblado.

Para los archivos de origen de Visual C#:

csc /target:library helloworld.cs 

Para los archivos de origen de Visual Basic:

vbc /target:library helloworld.vb

Estos comandos inician el compilador de Visual C# o Visual Basic mediante la opción /target para especificar la creación de un archivo DLL de biblioteca.

Cargar y ejecutar el procedimiento almacenado "Hello World" en SQL Server

Una vez que el procedimiento de ejemplo se haya compilado correctamente, podrá probarlo en SQL Server. Para ello, abra SQL Server Management Studio y cree una nueva consulta, conectándose a una base de datos de prueba adecuada, como la base de datos de ejemplo AdventureWorks2008R2.

La capacidad de ejecutar el código de Common Language Runtime (CLR) está establecida de forma predeterminada en OFF en SQL Server. El código CLR puede habilitarse mediante el procedimiento almacenado del sistema sp_configure. Para obtener más información, vea Habilitar la integración CLR.

Tendremos que crear el ensamblado de modo que podamos obtener acceso al procedimiento almacenado. Para este ejemplo, vamos a suponer que ha creado el ensamblado helloworld.dll en el directorio C:\. Agregue la siguiente instrucción Transact-SQL a su consulta.

CREATE ASSEMBLY helloworld from 'c:\helloworld.dll' WITH PERMISSION_SET = SAFE

Una vez creado el ensamblado, podremos obtener acceso a nuestro método HelloWorld mediante la instrucción CREATE PROCEDURE. Llamaremos a nuestro procedimiento almacenado "hello":

CREATE PROCEDURE hello
@i nchar(25) OUTPUT
AS
EXTERNAL NAME helloworld.HelloWorldProc.HelloWorld

Una vez creado el procedimiento, podrá ejecutarse como un procedimiento almacenado normal escrito en Transact-SQL. Escriba el siguiente comando:

DECLARE @J nchar(25)
EXEC hello @J out
PRINT @J

Este comando debería dar lugar a la siguiente salida en la ventana de mensajes de SQL Server Management Studio.

Hello world!
Hello world!

Quitar el ejemplo de procedimiento almacenado "Hello World"

Cuando haya terminado de ejecutar el procedimiento almacenado de ejemplo, puede quitar el procedimiento y el ensamblado de la base de datos de prueba.

En primer lugar, quite el procedimiento mediante el comando de drop procedure.

IF EXISTS (SELECT name FROM sysobjects WHERE name = 'hello')
   drop procedure hello

Una vez quitado el procedimiento, puede quitar el ensamblado que contiene su código de ejemplo.

IF EXISTS (SELECT name FROM sys.assemblies WHERE name = 'helloworld')
   drop assembly helloworld