Partilhar via


Introdução à integração 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 SQL Server com o .NET FRAMEWORK CLR (Common Language Runtime). O tópico também mostra como escrever, compilar e executar um procedimento armazenado CLR simples escrito no Microsoft Visual C#.

Namespaces obrigatórios

Começando com 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 localizado no GAC (cache de assembly global), bem como no diretório do .NET Framework. Uma referência a esse assembly normalmente é adicionada automaticamente por ferramentas de linha de comando e pelo Microsoft Visual Studio, portanto, não há necessidade de adicioná-lo manualmente.

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

System.Data

System.Data.Sql

Microsoft.SqlServer.Server

System.Data.SqlTypes

Escrevendo um simples procedimento armazenado "Hello World"

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  
  

Esse programa simples contém um único método estático em uma classe pública. Esse método usa duas classes novas, SqlContext e SqlPipe, para criar objetos de banco de dados gerenciados para produzir uma mensagem de texto simples. O método também atribui a cadeia de caracteres "Hello World!" como valor de um parâmetro out. Esse método pode ser declarado como um procedimento armazenado no procedimento armazenado Transact-SQL.

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

Compilando o procedimento armazenado "Hello World"

A Microsoft .NET Framework arquivos de redistribuição 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ê precisa modificar sua variável de caminho para que aponte para o diretório que contém csc.exe ou vbc.exe. A seguir está o caminho de instalação padrão do .NET Framework.

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

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

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

Depois de adicionar o diretório do .NET Framework ao caminho, você pode compilar o exemplo de procedimento armazenado em um assembly com o comando a seguir. A opção /target permite compilá-lo 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 do Visual C# ou do Visual Basic que usa a opção /target para especificar a compilação de uma DLL da biblioteca.

Carregando e executando o procedimento armazenado "Hello World" no SQL Server

Depois que o procedimento de exemplo for compilado com êxito, você poderá testá-lo em 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 código CLR (Common Language Runtime) é definida como OFF por padrão em 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 podermos acessar o procedimento armazenado. Nesse exemplo, vamos pressupor 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  

Após a criação do assembly, poderemos acessar nosso método HelloWorld usando a instrução create procedure. Chamaremos nosso procedimento armazenado de "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  

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 SQL Server Management Studio mensagens.

Hello world!  
Hello world!  

Removendo o exemplo de procedimento armazenado "Hello World"

Quando você concluir a execução do exemplo de procedimento armazenado, poderá remover o procedimento e o assembly de seu 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  

Após o descarte do procedimento, você poderá remover o assembly que contém seu código de exemplo.

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

Consulte Também

Procedimentos armazenados CLR
Extensões específicas em processo do SQL Server para o ADO.NET
Depurando objetos de banco de dados CLR
Segurança da integração CLR