Как видно из этого фрагмента, теперь вместо указания
тела процедуры на T-SQL можно указать метод класса из загруженной ранее сборки.
К этому методу предъявляются следующие требования:
Это должен быть статический метод (не конструктор и не
деструктор класса)
Число параметров должно совпадать с числом параметров
в описании хранимой процедуры, а их типы должны быть совместимы с типами данных
соответствующих параметров. Если параметр процедуры объявлен как OUTPUT, то
соответствующий параметр метода должен передаваться по ссылке.
Метод должен либо не иметь возвращаемого значения, либо возвращать значение одного из следующих типов: SQLInt32, SQLInt16, System.Int32, System.Int16
Для успешного создания такой хранимой процедуры
необходимо быть владельцем соответствующей сборки или иметь для нее права
REFERENCES.
Давайте перейдем от слов к делу и попробуем создать
хранимую процедуру.
Минимальный код хранимой процедуры на C# выглядит вот
таким образом:
using System;
using System.Data;
using System.Data.Sql;
using System.Data.SqlServer;
using System.Data.SqlTypes;
public class StoredProcedure
{
[SqlProcedure]
public static void
MyProcedure()
{
}
};
|
Очевидно, он не очень функционален. Тем не менее, метод StoredProcedure.MyProcedure уже можно зарегистрировать в базе данных
качестве хранимой процедуры, вызвать (например, из Query Analyzer), и
убедиться, что он успешно выполняется (то есть ничего не делает).
Обратите внимание на атрибут SqlProcedure
(System.Data.Sql.SqlProcedureAttribute). Этот атрибут не несет никакой
информации для MS SQL Server. Он используется MS Visual Studio Whidbey при
развертывании проекта – для методов, помеченных таким атрибутом, автоматически
будут вызваны соответствующие операторы CREATE PROCEDURE. По умолчанию будет
предпринята попытка назначить хранимой процедуре такое же имя, как и у метода.
Это поведение можно изменить, воспользовавшись единственным свойством атрибута
– Name. Если заменить девятую строку примера выше на
[SqlProcedure("MyProcName")], то хранимая процедура будет называться
MyProcName.
Здравствуй, мир
Останавливаться на том, каким образом хранимая
процедура обрабатывает данные, смысла нет – это обычный C#, и его особенности
хорошо известны. Давайте научим ее общаться с внешним миром. Для начала доведем
ее до уровня Кернигана и Ритчи: