Compartir a través de


Introducción a la integración CLR

En este tema se proporciona información general sobre los espacios de nombres y las bibliotecas necesarios para compilar objetos de base de datos mediante la integración de SQL Server con Common Language Runtime (CLR) de .NET Framework. 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. 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. Por lo general, tanto las herramientas de línea de comandos como Microsoft Visual Studio agregan automáticamente una referencia a este ensamblado, así que no es necesario agregarlo 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 se puede declarar como un procedimiento almacenado en el procedimiento almacenado de Transact-SQL.

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

Compilar el procedimiento almacenado "Hello World"

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, puede probarlo en SQL Server Management Studio y crear una nueva consulta, conectándose a una base de datos de prueba adecuada (por ejemplo, la base de datos de ejemplo AdventureWorks).

La capacidad de ejecutar código de Common Language Runtime (CLR) se establece en OFF de forma predeterminada en SQL Server. El código CLR se puede habilitar mediante el procedimiento almacenado del sistema sp_configure . Para más información, consulte Enabling CLR Integration.

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 la 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  
-- if the HelloWorldProc class is inside a namespace (called MyNS),  
-- the last line in the create procedure statement would be  
-- EXTERNAL NAME helloworld.[MyNS.HelloWorldProc].HelloWorld  

Después de haber creado el procedimiento, se puede ejecutar igual que un procedimiento almacenado normal escrito en Transact-SQL. Ejecute el comando siguiente:

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

Se mostrará el siguiente resultado 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  

Consulte también

Procedimientos almacenados de CLR
Extensiones específicas en proceso de SQL Server a ADO.NET
Depurar objetos de base de datos CLR
Seguridad de la integración CLR