Skip to main content
Как подружить C# и T-SQL




                           Алексей Давидич
                           Software Engineer
                           M. C. Dean
   Необходимость появления SQL CLR
   Сравнение T-SQL и C#
   Вопросы производительность
   Возможности SQL CLR
   T-SQL не является
    оптимальным языком
    программирования
    для ряда задач
   Улучшенная
    парадигма
    программирования

   Упрощённая
    разработка
   Возможность
    получить более
    производительные и
    гибкие решения
   Механизм Code
    Access Security
    (CAS)
C#                   T-SQL
   Сложные вычисления    Прямой доступ к
   Работа со строками     данным
   Ветвистая логика      Большие объёмы
   Работа с RegEx         данных
   Шифрование            Отсутствие сложной
   Прямой доступ к        логики
    файловой системе
   …
SQL Query


  Compiler        MSIL


                   JIT
                 Native
Execution Plan            CLR HOST
                 BRIDGE
   CLR User-Defined Functions
     CLR Scalar-Valued Functions
     CLR Table-Valued Functions
     CLR User-Defined Aggregates
   CLR User-Defined Types
   CLR Stored Procedures
   CLR Triggers
sp_configure 'show advanced options', 1;
GO

RECONFIGURE;
GO

sp_configure 'clr enabled', 1;
GO

RECONFIGURE;
GO
 Компиляция
csc /target:library [name].cs

   Загрузка сборки на сервер
CREATE ASSEMBLY myAssembly
FROM 'c:[name].dll'
WITH PERMISSION_SET = SAFE

   Создание хранимой процедуры
CREATE PROCEDURE hello
@i nchar(25) OUTPUT
AS EXTERNAL NAME myAssembly.MyNamespace.myStoreProc
SQL запрос           Результат


SQL Server

                   Query Processor

                 SQL CLR Module
   (Store procedure, UDFs, UDTs, UDAs, Triggers)

       CLR Hosting Module (.Net Framework)

SQL Server Database              EXTERNAL
      Engine                     _ACCESS
                                                    UNSAFE

         SAFE
                             Files,
                                              Native DLLs,
                            Registry,
                                               COM DLLs
  Database                  Network
!!! 227 раз быстрее !!!
   Новый механизм, на порядок
    превосходящий раннюю реализацию в
    extended store procedure.
   Возвращает IEnumerable, подключаемый
    напрямую к плану запроса
   Уменьшаем время доступа
   Снижает накладные издержки расхода
    памяти
   TVP (in & out) не применимы при
    использования контекстного соединения
   Update, Insert & Delete запрещены
   CLR TVF не поддерживают constraints и
    индексы уникальности
   CLR TVF не могут вернуть таблицу с
    колонками типа Timestamp или non-
    unicode текст
   SqlContext – предоставляет доступ к
    другим расширениям, а также некоторую
    информацию о контексте исполнения
     SqlPipe - для возврата табличных данных и
      сообщений клиенту
     SqlTriggerContext - представляет информацию
      о контексте в котором срабатывает триггер
   SqlDataRecord - для возврата
    динамически конфигурируемых наборов
    данных из хранимой процедуры
   MSDN: http://msdn.microsoft.com/en-
    us/library/ms131102(SQL.100).aspx
   Cookbook (O’REILLY) :
    http://msdn.microsoft.com/en-
    us/library/orm-9780596101404-02-12.aspx
   MSDN Blog (Exception handling):
    http://blogs.msdn.com/b/sqlclr/archive/2006/
    06/29/651649.aspx
Спасибо!