Share via


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

Actualización: noviembre 2007

Este tema se aplica a:

Edición

Visual Basic

C#

C++

Web Developer

Express

Estándar

Pro y Team

Leyenda de la tabla:

Se aplica

No procede

Comando o comandos ocultos de manera predeterminada.

Este ejemplo muestra cómo depurar una función con valores de tabla definida por el usuario (UDF) de 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 Valores de configuración de Visual Studio.

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

  1. En un nuevo proyecto de SQL Server, establezca una conexión a una base de datos. Para obtener más información, vea Cómo: Conectarse a una base de datos.

  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 Cómo: Desarrollar con el tipo de proyecto de SQL Server.

  3. Agregue una secuencia de comandos 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 (ratón) 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 secuencia de comandos de depuración predeterminada.

  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 Resultados, seleccione Resultado de base de datos en la lista desplegable Mostrar resultados desde; podrá observar los resultados de la ejecución de dos consultas en la secuencia de comandos 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 CLR de servidor SQL Server definido por el usuario

Otros recursos

Depuración de bases de datos de SQL CLR