Как подружить 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
Спасибо!

Sql server clr integration

  • 1.
    Как подружить C#и T-SQL Алексей Давидич Software Engineer M. C. Dean
  • 2.
    Необходимость появления SQL CLR  Сравнение T-SQL и C#  Вопросы производительность  Возможности SQL CLR
  • 3.
    T-SQL не является оптимальным языком программирования для ряда задач
  • 4.
    Улучшенная парадигма программирования  Упрощённая разработка
  • 5.
    Возможность получить более производительные и гибкие решения
  • 6.
    Механизм Code Access Security (CAS)
  • 7.
    C# T-SQL  Сложные вычисления  Прямой доступ к  Работа со строками данным  Ветвистая логика  Большие объёмы  Работа с RegEx данных  Шифрование  Отсутствие сложной  Прямой доступ к логики файловой системе  …
  • 9.
    SQL Query Compiler MSIL JIT Native Execution Plan CLR HOST BRIDGE
  • 10.
    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
  • 11.
    sp_configure 'show advancedoptions', 1; GO RECONFIGURE; GO sp_configure 'clr enabled', 1; GO RECONFIGURE; GO
  • 13.
     Компиляция 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
  • 14.
    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
  • 17.
    !!! 227 разбыстрее !!!
  • 20.
    Новый механизм, на порядок превосходящий раннюю реализацию в extended store procedure.  Возвращает IEnumerable, подключаемый напрямую к плану запроса  Уменьшаем время доступа  Снижает накладные издержки расхода памяти
  • 21.
    TVP (in & out) не применимы при использования контекстного соединения  Update, Insert & Delete запрещены  CLR TVF не поддерживают constraints и индексы уникальности  CLR TVF не могут вернуть таблицу с колонками типа Timestamp или non- unicode текст
  • 26.
    SqlContext – предоставляет доступ к другим расширениям, а также некоторую информацию о контексте исполнения  SqlPipe - для возврата табличных данных и сообщений клиенту  SqlTriggerContext - представляет информацию о контексте в котором срабатывает триггер  SqlDataRecord - для возврата динамически конфигурируемых наборов данных из хранимой процедуры
  • 31.
    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
  • 32.

Editor's Notes

  • #5 Языки программирования .Net Framework во многих отношениях богаче языка T-Sql, предоставляя разработчику конструкции и возможности, прежде не доступные SQL Server разработчикам.Все средства, которые мы привыкли использовать для разработки и отладки средне-уровневых (middle-tier) или клиентских приложений.
  • #6 Во многих случаях, используя языки .NetFramework можно достигнуть лучшей производительности, чем при использовании T-SQL
  • #7 Ядро базы данных запускает CLR среду в которой в дальнейшем исполняется управляемый код. А как известно, управляемый код использует механизм Code Access Security (CAS) для предотвращения выполнения потенциально опасного кода внутри сборок. И это даёт безопасную альтернативу расширенным хранимым процедурам (extended stored procedures) доступных в ранних версиях SQL Server.
  • #16 Методология: постановка задачи -> реализация на T-SQL и C# -> выполнение выборки данных с использованием различных реализаций
  • #26 Out param
  • #28 messages , tabular results, dynamic
  • #29 Может быть структрурой/классом и должен:реализовывать INullableиметь методы Parse и ToStringиметь конструктор без параметровне иметь перегруженных методов (кроме ctor)static члены либо read-only, либо константыбыть сериализируем или реализовывать IXmlSerializable
  • #32 Сказать о баге с NULL RETURN_VALUE