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