Compartir a través de


Tutorial: Depurar una función con valores de tabla definida por el usuario de SQL CLR

Este tema se aplica a:

Edición

Visual Basic

C#

C++

Web Developer

Express

El tema no es aplicable El tema no es aplicable El tema no es aplicable El tema no es aplicable

Standard

El tema no es aplicable El tema no es aplicable El tema no es aplicable El tema no es aplicable

Pro y Team

El tema es aplicable El tema es aplicable El tema es aplicable El tema es aplicable

En este ejemplo se muestra cómo se depura una función con valores de tabla definida por el usuario (UDF) de SQL Server Common Language Runtime (SQL CLR).

Si al intentar depurar un objeto SQL CLR, aparece el mensaje "Cancelado por el usuario", debe configurar manualmente el equipo en el que se ejecuta Visual Studio y el equipo en el que se ejecuta SQL Server. Para obtener más información, vea Cómo: Configurar sus equipos para habilitar la depuración Transact-SQL y SQL CLR.

Nota

Los cuadros de diálogo y comandos de menú que se ven pueden diferir de los descritos en la Ayuda, en función de los valores de configuración o de edición activos. Para cambiar la configuración, elija la opción Importar y exportar configuraciones del menú Herramientas. Para obtener más información, vea Trabajar con valores de configuración.

Para depurar una función con valores de tabla definida por el usuario de SQL CLR

  1. En un nuevo proyecto de SQL CLR, establezca una conexión a una base de datos. Para obtener más información, vea How to: Connect to a Database.

  2. Cree una nueva función con el código de la primera parte del ejemplo siguiente y asígnele el nombre TableOfPrimes.cs. Para obtener más información, vea How to: Develop with the SQL Server Project Type.

  3. Agregue un script que comprueba la función incluyéndola en una instrucción SELECT. En el Explorador de soluciones, haga clic con el botón secundario del mouse en el directorio SecuenciasDePrueba, seleccione Agregar script de prueba e inserte el código de la segunda parte del ejemplo siguiente. Guarde el archivo con el nombre TestPrime.sql. Haga clic con el botón secundario del mouse en el nombre del archivo y elija Establecer como script de depuración predeterminado.

  4. Establezca puntos de interrupción en TableOfPrimes.cs y, a continuación, en el menú Depurar, haga clic en Iniciar para compilar, implementar y hacer pruebas unitarias en el proyecto. Cuando aparece el puntero de instrucción, designado mediante una flecha amarilla, sobre un punto de interrupción, se está depurando el código de SQL CLR.

  5. Pruebe características de depuración diferentes.

    1. En el menú Depurar, haga clic varias veces en Paso a paso por instrucciones para observar la ejecución de la función línea por línea.

    2. Al ejecutar paso a paso las instrucciones de la función puede utilizar las ventanas Variables locales e Inspección para observar los valores de miembros diferentes.

    3. Haga clic de nuevo en Continuar para finalizar la depuración de la función.

    4. En la Ventana de salida, seleccione Resultado de base de datos en la lista desplegable Mostrar resultados desde y podrá observar los resultados de la ejecución de dos consultas en el script TestPrimes.sql.

Ejemplo

Éste es el código que lee el Registro 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 es el script de prueba que llama a la función.

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

Vea también

Tareas

Cómo: Crear y ejecutar una función definida por el usuario de SQL Server mediante la integración de Common Language Runtime