Partilhar via


Introdução à integração do CLR

Este tópico fornece uma visão geral dos namespaces e bibliotecas necessários para compilar objetos de banco de dados usando a integração do SQL Server com o CLR (Common Language Runtime) do .NET Framework. O tópico também mostra como escrever, compilar e executar um procedimento armazenado CLR simples escrito no Microsoft Visual C#.

Namespaces necessários

Começando com o SQL Server. A funcionalidade de integração clr é exposta em um assembly chamado system.data.dll, que faz parte do .NET Framework. Esse assembly pode ser encontrado no GAC (Cache de Assembly Global), bem como no diretório do .NET Framework. Uma referência a esse assembly normalmente é adicionada automaticamente pelas ferramentas de linha de comando e pelo Microsoft Visual Studio, portanto, não é necessário adicioná-lo manualmente.

O assembly system.data.dll contém os seguintes namespaces, que são necessários para compilar objetos de banco de dados CLR:

System.Data

System.Data.Sql

Microsoft.SqlServer.Server

System.Data.SqlTypes

Escrevendo um procedimento armazenado simples "Olá, Mundo"

Copie e cole o código do Visual C# ou do Microsoft Visual Basic a seguir em um editor de texto e salve-o em um arquivo chamado "helloworld.cs" ou "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 simples contém um único método estático em uma classe pública. Esse método usa duas novas classes SqlContext e SqlPipe, para criar objetos de banco de dados gerenciados para gerar uma mensagem de texto simples. O método também atribui a cadeia de caracteres "Olá, mundo!" como o valor de um parâmetro out. Esse método pode ser declarado como um procedimento armazenado em Transact-SQL procedimento armazenado.

Agora compilaremos esse programa como uma biblioteca, o carregaremos no SQL Server e o executaremos como um procedimento armazenado.

Compilando o procedimento armazenado "Olá, Mundo"

Arquivos de redistribuição do Microsoft .NET Framework por padrão. Esses arquivos incluem csc.exe e vbc.exe, os compiladores de linha de comando para os programas Visual C# e Visual Basic. Para compilar nosso exemplo, você deve modificar a variável de caminho para apontar para o diretório que contém csc.exe ou vbc.exe. Veja a seguir o caminho de instalação padrão do .NET Framework.

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

A versão contém o número de versão do .NET Framework redistribuível instalado. Por exemplo:

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

Depois de adicionar o diretório do .NET Framework ao seu caminho, você poderá compilar o procedimento armazenado de exemplo em um assembly com o comando a seguir. A /target opção permite compilá-la em um assembly.

Para arquivos de origem do Visual C#:

csc /target:library helloworld.cs   

Para arquivos de origem do Visual Basic:

vbc /target:library helloworld.vb  

Esses comandos iniciam o compilador visual C# ou Visual Basic usando a opção /target para especificar a criação de uma DLL de biblioteca.

Carregando e executando o procedimento armazenado "Olá, Mundo" no SQL Server

Depois que o procedimento de exemplo tiver sido compilado com êxito, você poderá testá-lo no SQL Server Management Studio e criar uma nova consulta, conectando-se a um banco de dados de teste adequado (por exemplo, o banco de dados de exemplo adventureworks).

A capacidade de executar o código CLR (Common Language Runtime) é definida como OFF por padrão no SQL Server. O código CLR pode ser habilitado usando o procedimento armazenado do sistema sp_configure . Para obter mais informações, consulte Enabling CLR Integration.

Precisaremos criar o assembly para que possamos acessar o procedimento armazenado. Para este exemplo, presumiremos que você criou o assembly helloworld.dll no diretório C:\. Adicione a seguinte instrução Transact-SQL à consulta.

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

Depois que o assembly tiver sido criado, agora podemos acessar nosso método HelloWorld usando a instrução create procedure. Chamaremos nosso procedimento armazenado de "olá":

  
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  

Depois que o procedimento tiver sido criado, ele poderá ser executado como um procedimento armazenado normal escrito no Transact-SQL. Execute o comando a seguir:

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

Isso deve resultar na saída a seguir na janela de mensagens do SQL Server Management Studio.

Hello world!  
Hello world!  

Removendo o exemplo de procedimento armazenado "Olá, Mundo"

Quando terminar de executar o procedimento armazenado de exemplo, você poderá remover o procedimento e o assembly do banco de dados de teste.

Primeiro, remova o procedimento usando o comando drop procedure.

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

Depois que o procedimento for removido, você poderá remover o assembly que contém o código de exemplo.

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

Consulte Também

Procedures Armazenadas CLR
O SQL Server In-Process extensões específicas para ADO.NET
Depurando objetos de banco de dados CLR
Segurança da integração CLR