Поделиться через


Пошаговое руководство. Отладка пользовательской функции с табличным значением SQL CLR

Обновлен: Ноябрь 2007

Этот раздел применим к:

Выпуск

Visual Basic

C#

C++

Web Developer

Экспресс-выпуск

Тема не применяется Тема не применяется Тема не применяется Тема не применяется

Standard

Тема не применяется Тема не применяется Тема не применяется Тема не применяется

Pro и Team

Тема применяется Тема применяется Тема применяется Тема применяется

Условные обозначения таблицы:

Тема применяется

Применяется

Тема не применяется

Не применяется

Тема применяется, но команда по умолчанию сокрыта

Команда или команды, скрытые по умолчанию.

В этом примере демонстрируется описание отладки пользовательской функции с табличным значением SQL CLR (UDF).

ms165054.alert_note(ru-ru,VS.90).gifПримечание.

Отображаемые диалоговые окна и команды меню могут отличаться от описанных в справке, в зависимости от текущих параметров или выпуска. Чтобы изменить параметры, в меню Сервис выберите команду Параметры импорта и экспорта. Дополнительные сведения см. в разделе Параметры Visual Studio.

Отладка пользовательской функции с табличным значением SQL CLR

  1. В новом проекте SQL Server Project установите соединение с базой данных. Дополнительные сведения см. в разделе Практическое руководство. Подключение к базе данных.

  2. Создайте новую функцию с помощью кода из раздела первого примера ниже и присвойте ей имя TableOfPrimes.cs. Дополнительные сведения см. в разделе Практическое руководство. Разработка с помощью типа проекта SQL Server.

  3. Добавьте сценарий, тестирующий функцию, включив его в оператор SELECT. В Обозревателе решений щелкните правой кнопкой мыши каталог TestScripts, выберите Добавить тестовый сценарий и вставьте код из раздела второго примера, следующего ниже. Сохраните файл под именем TestPrime.sql. Щелкните правой кнопкой мыши имя файла и выберите Использовать как сценарий отладки по умолчанию.

  4. Установите точки останова в TableOfPrimes.cs, а затем в меню Отладка нажмите кнопку Пуск для компиляции, развертывания и модульного теста проекта. Появление указателя инструкций, имеющего вид желтой стрелки на точке останова, означает, что выполняется отладка кода SQL CLR.

  5. Попробуйте использовать различные функции отладки.

    1. В меню Отладка несколько раз нажмите Шаг с заходом, чтобы наблюдать построчное выполнение функции.

    2. При проходе через функцию можно использовать окна Локальные переменные и Контрольные значения для просмотра значений различных элементов.

    3. Снова нажмите кнопку Продолжить для завершения отладки функции.

    4. В окне Выходные данные выберите Выходные данные базы данных из выпадающего списка Показать выход из; после этого можно просмотреть результаты выполнения двух запросов в сценарии TestPrimes.sql.

Пример

Это код, считывающий журнал событий.

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); 
        }
    }
}

Это тестовый сценарий вызова функции.

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

См. также

Задачи

Практическое руководство. Создание и запуск пользовательской функции SQL Server в среде CLR

Другие ресурсы

Отладка баз данных SQL в среде CLR