Язык Transact-SQL (T-SQL) Microsoft SQL Server (MS SQL) обладает довольно широкими возможностями не только в плане построения запросов, но и разработки серверной бизнес логики (back-end). Но, тем не менее, эти возможности далеко не безграничны.
Существует 2 основных подхода к решению задач не подвластных T-SQL.
- Реализация необходимого функционала в рамках клиентского приложения либо сервера приложения (при трёхзвенной архитектуре);
- Использование внутри базы данных (БД) программного кода .NET. Конкретно, технологии SQLCLR.
Последний подход позволяет, в частности, перенести часть логики с клиента или сервера приложения в БД тем самым освободив их от выполнения ряда задач, которые не имеют прямого отношения к их работе.
С помощью технологии SQLCLR можно «научить» БД выполнять сложные алгоритмы по обработке данных. Если учесть, то, что в SQLCLR доступен практически весь арсенал средств .NET (за исключением разве что визуального интерфейса), то, в случае необходимости, можно разработать БД, которая полностью реализует всю бизнес-логику. Клиентской программе остаётся только запрашивать и отображать полученные данные либо отправлять в БД новые для обработки.
Для того чтобы проиллюстрировать использование технологии SQLCLR воспользуемся простым, но, в тоже время, весьма показательным примером. Реализуем вычисление МD5 для строки непосредственно в БД. Эту задачу нельзя решить штатными средствами T-SQL, но с помощью SQLCLR это становится возможным.
Вначале создадим в Visual Studio, так называемый, «Проект базы данных SQL Server».
Создадим функцию, которая будет вычислять MD5 для строки.
Шаблон функции с подключением необходимых сборок Visual Studio создаст автоматически. Остаётся только его отредактировать и написать нужный код. Напомним, что, для вычисления MD5, необходимо дополнительно подключить следующие сборки: System.Security.Cryptography и System.Text. В данном примере функция названа просто Md5, и она принимает только 1 параметр в виде строки, для которой вычисляется хэш-сумма.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
public partial class UserDefinedFunctions { [Microsoft.SqlServer.Server.SqlFunction] public static SqlString getMd5(string str) { byte[] bytes = Encoding.Unicode.GetBytes(str); MD5CryptoServiceProvider CSP = new MD5CryptoServiceProvider(); byte[] byteHash = CSP.ComputeHash(bytes); string hash = string.Empty; foreach (byte b in byteHash) hash += string.Format("{0:x2}", b); return new SqlString (hash); } } |
Атрибут [Microsoft.SqlServer.Server.SqlFunction] означает, что эта функция предназначена для использования в БД MS SQL. Класс UserDefinedFunctions отвечает за функции SQLCLR определённые пользователем/
После этого остаётся только скомпилировать сборку, и она будет полностью готова к использованию в БД.
Добавить комментарий