Тут я показывал как можно определять сколько раз подстрока встречается в строке. Для этого мы создали обычную пользователскую функцию с помощью T-SQL.
Сейчас я покажу как сделать то же самое с помощью функции написанной с применением технологии SQLCLR.
1) Для начала нам потребуется создать в среде Visual Studio проект с типом Class Library:
using System; using System.Data.SqlTypes; using Microsoft.SqlServer.Server; namespace CLRFunctions { public static class CLRFunctions { [SqlFunction( DataAccess = DataAccessKind.None , IsDeterministic = true) ] public static SqlInt32 substring_cnt(string where, string what) { int i = 0; i = (where.Length - where.Replace(what, string.Empty).Length) / what.Length; return (SqlInt32)i; } } }
Далее потребуется скомпилировать проект и получить библиотеку CLRFunctions.dll. Этот файл следует поместить в каталог, доступный для SQL Server.
2) Далее для того, чтобы можно было использовать библиотеки CLR, необходимо разрешить использование CLR на вашем сервере MS SQL:
sp_configure 'clr enabled', 1 reconfigure go
3) Теперь можно создать Assembly на сервере:
create assembly CLRAssembly from 'c:\CLR\CLRFunctions.dll' with permission_set = safe go
и пользовательскую функцию:
create function dbo.substring_cnt(@where nvarchar(1000), @what nvarchar(100)) returns int as external name CLRAssembly.[CLRFunctions.CLRFunctions].substring_cnt
Применение функции: