Partilhar via


Demonstra Passo a passo: Depurar uma função de Table Valued definido pelo usuário CLR de SQL

Este tópico se aplica a:

Edition

Visual Basic

C#

C++

Desenvolvedores Web

Express

O tópico não é aplicável O tópico não é aplicável O tópico não é aplicável O tópico não é aplicável

Standard

O tópico não é aplicável O tópico não é aplicável O tópico não é aplicável O tópico não é aplicável

Pro e equipe

O tópico é aplicável O tópico é aplicável O tópico é aplicável O tópico é aplicável

Este exemplo mostra como depurar um SQL Server User Defined Table-Valued de Common Language Runtime (CLR SQL) função (UDF).

Se, quando você tentar depurar um objeto CLR em SQL, a mensagem "Cancelada pelo usuário" aparece, você deve configurar manualmente o computador no qual você está executando Visual Studio , bem como o computador que está executando o SQL Server. Para obter mais informações, consulte Como: Configurar seus computadores para habilitar o Transact-SQL e depuração de CLR de SQL.

ObservaçãoObservação

As caixas de diálogo e comandos de menu demonstradas podem ser diferentes daqueles descritos na Ajuda, dependendo das configurações ativas ou configurações de edição. Para alterar as configurações, escolha Import and Export Settings sobre o Ferramentas menu. Para obter mais informações, consulte Trabalhando com configurações.

Para depurar uma função de valor de tabela definidos pelo usuário CLR de SQL

  1. Em um novo projeto de SQL de CLR, estabelecer uma conexão a um banco de dados. Para obter mais informações, consulte How to: Connect to a Database.

  2. Crie uma nova função usando o código da primeira seção do exemplo abaixo e o nome TableOfPrimes.cs. Para obter mais informações, consulte How to: Develop with the SQL Server Project Type.

  3. Adicionar um script que testa a função incluindo-o em um SELECT instrução. Em Solution Explorer, com o botão direito do TestScripts directory, clique em Add Test Scripte insira o código da segunda das seções de exemplo a seguir. Salve o arquivo com o nome TestPrime.sql. Clique com o botão direito no nome do arquivo e, em seguida, clique em Set as Default Debug Script.

  4. Definir pontos de interrupção de TableOfPrimes.cs e em seguida, o Debug menu, clique em Iniciar para compilar, implantar e o projeto de teste de unidade. Quando o ponteiro de instrução, designado por uma seta amarela, aparece em um ponto de interrupção, você está depurando o código de SQL de CLR.

  5. Experimente recursos de depuração diferentes.

    1. Sobre o Debug menu, clique em Step Into repetidamente para observar a linha por linha de execução da função.

    2. Conforme você avança por meio da função, você pode usar o Locals e Watch windows para observar os valores dos membros de diferentes.

    3. Clique em continuar novamente para concluir a depuração da função.

    4. No saída janela, selecione Banco de dados de saída da Show output from na lista suspensa e você pode observar os resultados da execução de duas consultas no script TestPrimes.sql.

Exemplo

Este é o código que lê o Log de eventos.

using System;
using System.Data;
using System.Data.Sql;
using System.Data.SqlTypes;
using Microsoft.SqlServer.Server;
using System.Collections;

public partial class UserDefinedFunctions
{
    struct primeIndex
    {
        public int n;
        public int p;
        public primeIndex(int n, int p)  
        { 
            this.n = n; this.p = p;
        }
    }

    static bool isPrime(int p)
    {
        if (p < 2) return false;
        if (p == 2) return true;
        if (p % 2 == 0) return false;
        for (int d = 3; d * d <= p; d+=2)
        {
            if (p % d == 0) return false;
        }
        return true;
    }

    static int nextPrime(int p)
    {
        int result = p + 1;
        while (!isPrime(result)) result++;
        return result;
    }

    [SqlFunction(FillRowMethodName = "Fill", TableDefinition = "n int,p int,est float")]
    public static IEnumerable TableOfPrimes(int n)
    {
        int p = 1;
        for (int i = 1; i <= n; i++)
        {
            p = nextPrime(p);
            yield return new primeIndex(i, p);
        }
    }

    private static void Fill(object source, out int n, out int p, out SqlDouble est)
    {
        primeIndex pi = (primeIndex)source;
        n = pi.n;
        p = pi.p;
        if (n <5)
            est = SqlDouble.Null;
        else
        {
            double log = Math.Log(n);
            double loglog = Math.Log(log);
            est = n * (log + loglog - 1 + loglog / log - 2 / log); 
        }
    }
}

Este é o script de teste que chama a função.

SELECT n,p,est FROM dbo.TableOfPrimes(50)

SELECT TOP 10 n, p, est, est/p AS factor FROM dbo.TableOfPrimes(500) ORDER BY factor DESC

SELECT TOP 10 n, p, est, est/p AS factor FROM dbo.TableOfPrimes(1000) WHERE n>500 ORDER BY factor DESC

Consulte também

Tarefas

Como: Criar e executar uma função de SQL Server User-Defined usando a integração do Common Language Runtime