Вы можете создавать агрегатные функции SQL Server в .NET, которые затем можно будет встроить в встроенный SQL-сервер. Я думаю, что для этого требуется минимум SQL Server 2005 и Visual Studio 2010. Я сделал один с использованием Visual Studio 2013 Community Edition (бесплатно даже для коммерческого использования) для использования с .NET 2 и SQL Server 2005.
См. Статью MSDN: https://msdn.microsoft.com/en-us/library/91e6taax(v=vs.90).aspx
Сначала вам нужно включить функцию CLR на сервере SQL: https://msdn.microsoft.com/en-us/library/ms131048.aspx
sp_configure 'show advanced options', 1;
GO
RECONFIGURE;
GO
sp_configure 'clr enabled', 1;
GO
RECONFIGURE;
GO
- Создание SQL Server -> Проект базы данных SQL Server
- Щелкните правой кнопкой мыши новый проект и выберите Свойства
- Настройка целевой версии SQL Server в разделе «Параметры проекта»
- Настройка целевого языка CLR в SQL CLR (например, VB)
- Щелкните правой кнопкой мыши новый проект и выберите Добавить -> Новый элемент ...
- Когда появится диалоговое окно, выберите SQL Server -> SQL CLR VB -> SQL CLR VB Aggregate
Теперь вы можете написать свой побитовый код в VB:
Imports System
Imports System.Data
Imports System.Data.SqlClient
Imports System.Data.SqlTypes
Imports Microsoft.SqlServer.Server
<Serializable()> _
<Microsoft.SqlServer.Server.SqlUserDefinedAggregate(Format.Native)> _
Public Structure AggregateBitwiseOR
Private CurrentAggregate As SqlTypes.SqlInt32
Public Sub Init()
CurrentAggregate = 0
End Sub
Public Sub Accumulate(ByVal value As SqlTypes.SqlInt32)
'Perform Bitwise OR against aggregate memory
CurrentAggregate = CurrentAggregate OR value
End Sub
Public Sub Merge(ByVal value as AggregateBitwiseOR)
Accumulate(value.Terminate())
End Sub
Public Function Terminate() As SqlInt32
Return CurrentAggregate
End Function
End Structure
Теперь разверните его: https://msdn.microsoft.com/en-us/library/dahcx0ww(v=vs.90).aspx
- Создайте проект с помощью строки меню: Build -> Build ProjectName (если сборка завершится неудачно с ошибкой 04018, загрузите новую версию инструментов данных @ http://msdn.microsoft.com/en-US/data/hh297027 или перейдите в строку меню: Tools - > Расширения и обновления, затем в разделе обновлений выберите обновление для обновления Microsoft SQL Server для баз данных)
- Скопируйте скомпилированную DLL в C: \ Program Files \ Microsoft SQL Server \ MSSQL.1 \ MSSQL \ Binn и в C: \
Зарегистрировать DLL:
СОЗДАТЬ СБОРКУ [CLRTools] ИЗ ‘c: CLRTools.dll’ С PERMISSION_SET = SAFE
Создание агрегата в SQL:
CREATE AGGREGATE [dbo]. [AggregateBitwiseOR] (@ значение INT)
ВОЗВРАЩАЕТ INT
ВНЕШНЕЕ ИМЯ [CLRTools]. [CLRTools.AggregateBitwiseOR];
Если вы получили ошибку «Неверный синтаксис рядом с« EXTERNAL »», измените уровень совместимости базы данных, используя следующие команды:
Для SQL Server 2005: EXEC sp_dbcmptlevel 'DatabaseName', 90
Для SQL Server 2008: EXEC sp_dbcmptlevel 'DatabaseName', 100
Проверьте ваш код:
ВЫБРАТЬ dbo.AggregateBitwiseOR (Foo) КАК Foo ИЗ БРАКА
Мне показалась эта статья полезной: http://www.codeproject.com/Articles/37377/SQL-Server-CLR-Functions