Share 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 do Microsoft SQL Server com o Common Language Runtime (CLR) 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 obrigatórios

A partir do SQL Server 2005, os componentes necessários para desenvolver objetos de banco de dados de CLR básicos são instalados 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 localizado no GAC (cache de assembly global), bem como no diretório do .NET Framework. Normalmente uma referência a esse assembly é adicionada automaticamente por ferramentas de linha de comando e pelo Microsoft Visual Studio, por isso não é necessário 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 seguinte código em Visual C# ou Microsoft Visual Basic 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 procedimento armazenado no SQL Server e executado de maneira igual a um procedimento armazenado Transact-SQL.

Agora vamos compilar esse programa como uma biblioteca, carregá-lo no SQL Server e executá-lo como um procedimento armazenado.

Compilando o procedimento armazenado "Hello World"

O SQL Server instala os 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ê 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

Após o término da compilação do exemplo de procedimento, você pode testá-lo no SQL Server. Para isso, abra SQL Server Management Studio e crie uma consulta nova, conectando-se a um banco de dados de teste satisfatório (por exemplo, o banco de dados de exemplo AdventureWorks2008R2).

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

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 à sua 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

Após a criação do procedimento, ele poderá ser executado como um procedimento armazenado normal escrito em Transact-SQL. Execute o comando a seguir:

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

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

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