Introdução à integração do CLR

Aplica-se a: SQL Server

Este artigo 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 CLR (Common Language Runtime) do .NET Framework. O artigo também mostra como escrever, compilar e executar um pequeno procedimento armazenado no CLR escrito em Microsoft Visual C# e Visual Basic.

Namespaces obrigatórios

Os componentes necessários para desenvolver objetos de banco de dados CLR básicos são instalados com o SQL Server. A funcionalidade de integração do 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á-la 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

Dica

Há suporte para o carregamento de objetos de banco de dados CLR no Linux, mas eles devem ser criados com o .NET Framework (a integração do SQL Server CLR não oferece suporte ao .NET Core ou ao .NET 5 e versões posteriores). Além disso, assemblies de CLR com a permissão EXTERNAL_ACCESS ou UNSAFE definida não têm suporte no Linux.

Escrever um procedimento armazenado "Hello World"

Copie e cole o seguinte código Visual C# ou 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!";
    }
}

Esse programa 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 emitir uma mensagem de texto curta. O método também atribui a string "Hello world!" como o 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.

Compile esse programa como uma biblioteca, carregue-o no SQL Server e execute-o como um procedimento armazenado.

Compilar o procedimento armazenado "Hello World"

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

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

Version contém o número da versão do .NET Framework instalado. Por exemplo:

C:\Windows\Microsoft.NET\Framework\v4.8.0

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 seguinte comando. A opção /target permite compilá-lo em um assembly.

Em arquivos de origem do Visual C#:

csc /target:library helloworld.cs

Em 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.

Carregar e executar 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 fazer isso, abra o 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 AdventureWorks).

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 do sistema sp_configure. Para obter mais informações, consulte Enabling CLR Integration.

Precisaremos criar o assembly para podermos acessar o procedimento armazenado. Para este exemplo, vamos supor que você tenha criado 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;
-- 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

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!

Remover o exemplo de procedimento armazenado "Hello World"

Quando terminar de executar o exemplo de procedimento armazenado, você poderá remover o procedimento e o assembly do 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;

Próximas etapas

Para obter mais informações sobre a integração do CLR no SQL Server, consulte os seguintes artigos: