Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ЛР7.doc
Скачиваний:
16
Добавлен:
05.05.2019
Размер:
851.46 Кб
Скачать
  1. Пользовательские функции Скалярные функции

Создание пользовательской функции, как и хранимой процедуры, осуществляется путем добавления в проект шаблона Project | User-Defined Function....

Дадим имя модулю myfunc. Содержимое модуля представлено в листинге 4.10. Для работы с пользовательскими функциями мы создали новый проект sql2, но могли бы воспользоваться и старым проектом sql1, т. е. добавили бы пользовательскую функцию в старую сборку, где нами уже создана хранимая процедура.

Листинг 4.10

using System.Data;

using System.Data.SqlClient;

using System.Data.SqlTypes;

using Microsoft.SqlServer.Server;

public partial class UserDefinedFunctions

{

//атрибут

[Microsoft.SqlServer.Server.SqlFunction]

public static SqlString myfunc()

{

// Put your code here

return new SqlString("Hello");

}

};

Для создания пользовательской функции на основе модуля из листинга 4.10 следует выполнить последовательность команд из листинга 4.11.

Листинг 4.11

--удаляем функцию и сборку

drop function dbo. myfunc1

drop assembly sql2

go

--регистрируем сборку

create assembly sql2

from 'F:\sql\sql2\sql2\bin\Release\sql2.dll'

with permission_set = safe

go

--создаем пользовательскую функцию

create function myfunc1

(

)

returns nchar(15)

as

external name sql2.UserDefinedFunctions.myfunc

Созданная нами функция является скалярной. Она возвращает строковое значение. Кстати, обратите внимание, что ради совместимости тип возвращаемого значения определен нами как nchar. Теперь функция готова и может быть вызвана, например, командой select dbo.myfunc1 () или использована непосредственно в программе на языке Transact-SQL:

declare @nc nchar(15)

set @nc = dbo.myfunc1()+'!'

Если ваша скалярная функция должна возвратить некоторый скаляр, получаемый в результате выполнения некоторого запроса, то следующий пример может помочь вам это сделать (листинг 4.12).

Листинг 4.12

using System;

using System.Data;

using System.Data.SqlClient;

using System.Data.SqlTypes;

using Microsoft.SqlServer.Server;

public partial class UserDefinedFunctions

{

[SqlFunction(DataAccess = DataAccessKind.Read)]

public static int myfunc(SqlInt32 id)

{

SqlConnection conn = new SqlConnection("context connection=true");

conn.Open();

SqlCommand cmd = new SqlCommand();

cmd.CommandText =

"select count(*) as 'count' from dbo.students where id>" +

id.ToString();

cmd.Connection = conn;

return (int)cmd.ExecuteScalar();

}

};

Прокомментируем программный код из листинга 4.12.

Обратите внимание, что при задании атрибута задано свойство DataAccess. Это свойство определяет возможность доступа к данным. Метод ExecuteScalar выполняет запрос и возвращает элемент полученной таблицы, находящийся на пересечении первого столбца и первой строки. В данном случае результат выполнения запроса состоит всего из одного элемента.

Для того чтобы получить доступ к данным, приходится также создать объект SqlConnection — соединение.

Строка сmd.connection = conn; необходима, чтобы указать, посредством какого соединения будет осуществлен запрос.