Пошаговое руководство. Отладка пользовательского статистического выражения SQL CLR
Обновлен: Ноябрь 2007
Этот раздел применим для следующих версий.
Выпуск |
Visual Basic |
C# |
C++ |
Web Developer |
---|---|---|---|---|
Экспресс-выпуск |
||||
Standard |
||||
Pro и Team |
Условные обозначения:
Применимо |
|
Неприменимо |
|
Команда или команды по умолчанию скрыты. |
В этом примере демонстрируется отладка пользовательского статистического выражения CLR SQL. Создается новая статистическая функция CLR SQL c именем Concatenate в демонстрационной базе данных AdventureWorks. Функция, вызванная в операторе SQL, выполняет соединение всех значений для столбца, заданного в качестве входного параметра.
Примечание. |
---|
Отображаемые диалоговые окна и команды меню могут отличаться от описанных в справке, в зависимости от текущих параметров или выпуска. Чтобы изменить параметры, в меню Сервис выберите пункт Параметры импорта и экспорта. Дополнительные сведения см. в разделе Параметры Visual Studio. |
Отладка статистической функции CLR SQL
В новом проекте SQL Server установите соединение с учебной базой данных AdventureWorks. Дополнительные сведения см. в разделе Практическое руководство. Подключение к базе данных.
С помощью кода в первом из нижеследующих подразделов примера создайте новую функцию с именем Concatenate.cs. Дополнительные сведения см. в разделе Практическое руководство. Разработка с помощью типа проекта SQL Server.
Добавьте сценарий, тестирующий функцию, включив его в оператор SELECT. В Обозревателе решений щелкните правой кнопкой мыши каталог TestScripts, выберите Добавить тестовый сценарий и вставьте код из подраздела второго примера. Сохраните файл под именем Concatenate.sql. Щелкните правой кнопкой мыши имя файла и затем выберите Установить в качестве сценария отладки по умолчанию.
Разместите точку останова в Concatenate.csвнутри метода Accumulate в операторе if. Чтобы это сделать, щелкните затененное левое поле окна текстового редактора и в меню Отладка нажмите кнопку Пуск для компиляции, развертывания и модульного тестирования проекта. Появление указателя инструкций, имеющего вид желтой стрелки, на точке останова означает, что выполняется отладка функции.
Попробуйте выполнить другие функции отладки.
Метод Accumulate выполняется один раз для каждого ряда, составляющего предложение GROUP BY сценария в Concatenate.sql. Повторно нажимая Шаг с заходом из меню Отладка, можно видеть построение результата метода.
В окне Локальные переменные откройте переменную value, которая содержит имя текущего хранилища, подвергаемого обработке.
Щелкните переменную this. Дочерний узел intermediateResult будет возвращен из этой функции, он будет содержать все имена хранилища вплоть до текущего, объединенные вместе и разделенные запятыми.
В текстовом редакторе дважды щелкните переменную intermediateResult. Перетащите intermediateResult в окно Контрольное значение и разместите ее в любом месте этого окна. Теперь переменная добавлена в список контролируемых переменных.
Пройдитесь несколько раз по методу. Значение intermediateResult будет изменяться каждый раз при прохождении метода с дополнительным именем хранилища, присоединенным в конце.
Нажмите точку останова, чтобы удалить его, и добавьте точку останова к первому оператору внутри метода Terminate. Этот метод возвращает результат вызывающему объекту. Чтобы войти в него, в меню Отладка выберите команду Пуск. Теперь можно выполнять шаги нажатием кнопки Шаг с заходом в меню Отладка. Остановитесь по достижении оператора return.
Нажмите снова кнопку Продолжить для завершения отладки функции.
Пример
Это код для статистической функции, используемой в этом примере.
using System;
using System.Data.Sql;
using System.Data.SqlTypes;
using Microsoft.SqlServer.Server;
using System.IO;
using System.Text;
[Serializable]
[SqlUserDefinedAggregate(
//use CLR serialization to serialize the intermediate result.
Format.UserDefined,
//Optimizer property:
IsInvariantToNulls=true,
//Optimizer property:
IsInvariantToDuplicates=false,
//Optimizer property:
IsInvariantToOrder=false,
//Maximum size in bytes of persisted value:
MaxByteSize=8000)
]
public class Concatenate: IBinarySerialize
{
/// <summary>
/// Variable holds intermediate result of the concatenation
/// </summary>
private StringBuilder intermediateResult;
/// <summary>
/// Initialize the internal data structures
/// </summary>
public void Init( )
{
intermediateResult = new StringBuilder();
}
/// <summary>
/// Accumulate the next value, nop if the value is null
/// </summary>
/// <param name="value"></param>
public void Accumulate(SqlString value)
{
if(value.IsNull)
{
return;
}
intermediateResult.Append(value.Value).Append(',');
}
/// <summary>
/// Merge the partially computed aggregate with this aggregate.
/// </summary>
/// <param name="other"></param>
public void Merge( Concatenate other)
{
intermediateResult.Append(other.intermediateResult);
}
/// <summary>
/// Called at end of aggregation, to return results.
/// </summary>
/// <returns></returns>
public SqlString Terminate()
{
string output = string.Empty;
//Delete the trailing comma, if any .
if (intermediateResult != null && intermediateResult.Length > 0)
output = intermediateResult.ToString(0, intermediateResult.Length-1);
return new SqlString(output);
}
public void Read(BinaryReader r)
{
intermediateResult = new StringBuilder(r.ReadString());
}
public void Write(BinaryWriter w)
{
w.Write(intermediateResult.ToString());
}
}
Это тестовый сценарий вызова функции.
SELECT scu.SalesPersonID, dbo.Concatenate(sst.Name)
FROM Sales.Customer as scu
INNER JOIN Sales.Store as sst
ON scu.CustomerID = sst.CustomerID
INNER JOIN Sales.SalesPerson as spr
ON scu.SalesPersonID = spr.SalesPersonID
WHERE scu.SalesPersonID = 283
GROUP BY scu.SalesPersonID
См. также
Задачи
Практическое руководство. Создание и выполнение статистических функций SQL Server в среде CLR