Ни для кого (?) не секрет, что начиная с версии 2005 в MS SQL Server можно создавать хранимые процедуры не только на T-SQL, но и на управляемом коде. А в последних редакциях даже и на Python.
В каких сценариях это может пригодиться? Да в любых, где вам уже не хватает стандартных возможностей по манипулированию с данными, например, если вы захотите прямо в скуле "на лету" получать данные, хранящиеся в поле, соответствующее 1С-ному ХранилищуЗначений ;-)
Здесь не будет чего-то нереально сложного, среднестатистический 1с-ник сможет сам разобраться в данной теме, покопавшись в интернетах.
Не буду утомлять демагогией, приступим.
Поставим некоторую простую задачу, например, вычисление контрольной суммы, пусть будет MD5, от значения двоичных данных. (В скуле "из коробки" уже присутствует такая возможность, зато будет с чем сравнить свою поделку).
Делать сборку на управляемом коде будем на современном и мощном языке C#.
Сначала нам надо создать ключ подписи, он нам в дальнейшем пригодится. Делается это с помощью консольной утилиты "sn", входящей в состав SDK Windows:
sn.exe -k MD5CS.snk
Далее в любом текстовом редакторе необходимо создать файл, назовем его "MD5CS.cs". В нем будем писать движок нашего алгоритма:
Создадим класс, в нем статический void метод, перед методом разместим атрибут [Microsoft.SqlServer.Server.SqlProcedure], добавим требуемые пространства имен: System.Data.SqlTypes, System.Data.SqlClient, Microsoft.SqlServer.Server. Метод будет принимать и возвращать данные типа SqlBinary, но возвращать уже по ссылке. Внутри метода реализуем алгоритм вычисления MD5 хэша:
using (MD5 md5Hash = MD5.Create())
{
byte[] data = md5Hash.ComputeHash((byte[])inputData);
value = (SqlBinary)data;
}
Не забываем добавить пространство имен System.Security.Cryptography.
Сохраняем файл и компилируем его с помощью стандартного компилятора CSC от MS, добавив ранее сгенерированную подпись:
csc.exe /t:library /keyfile:MD5CS.snk /out:MD5CS.dll MD5CS.cs
На выходе получаем управляемую самоподписанную сборку MD5CS.dll, её то и будем подгружать в скуль.
Остальную работу будем делать в Management Studio.
До версии MS SQL Server 2014 (если не ошибаюсь) для разрешения использования CLR достаточно было выполнить
EXEC sp_configure 'clr enabled' , '1';
RECONFIGURE;
В MS SQL Server 2017 уже гораздо сложнее. Оставлю здесь ссылку: deploying-sql-clr-assembly-using-asymmetric-key
После включения разрешений создадим на скуле объект сборки в разделе "Программирование":
CREATE ASSEMBLY MD5CS FROM '<PATH_TO_ASSEMBLY>\MD5CS.dll'
WITH PERMISSION_SET=EXTERNAL_ACCESS
GO
Затем создадим нашу хранимку:
CREATE PROCEDURE MD5CSSUM (@binData varbinary(MAX), @md5sum varbinary(MAX) OUTPUT)
AS EXTERNAL NAME MD5CS.StoredProcedures.MD5CS;
Готово. Осталось проверить работоспособность, ну и для чистоты проделанной работы сравнить с оригиналом:
Вот такая магия )
Теперь вы знаете, как можно добавить в скуль свой функционал и рассчитать то, что раньше вычислялось на клиенте.
На всякий случай предоставляю все исходники.