Какие преимущества SQLServer CLR предлагает по сравнению с T-SQL? Насколько проще использовать синтаксис .NET, чем T-SQL? Я вижу, что вы можете определять типы пользователей, но мне не совсем понятно, почему это лучше. Например, вы можете определить тип электронной почты, и у него будет свойство префикса и свойство домена. Затем вы можете искать по домену, префиксу или по обоим. Однако я не вижу, чем это отличается от добавления пары столбцов, один из которых называется префиксом, а другой - домен, и поиска по ним индивидуально. Может быть, у кого-то есть реальные причины, по которым это лучше.





Разные цели. Хранимая процедура CLR полезна в тех случаях, когда написание высоко процедурного кода или использование системных средств, недоступных из T-SQL, было бы полезным. Хотя нет никаких причин, по которым нельзя писать sproc приложения против него, обычно вы не рассматриваете sproc CLR как просто другой язык для написания sproc приложения. Как правило, sproc среды CLR чаще всего используется для системных целей, а не для компонентов приложения, хотя это ни в коем случае не является жестким правилом.
Уровень интеграции CLR предлагает некоторые возможности, которые напрямую не доступны из хранимых процедур T-SQL, например настраиваемые агрегатные функции. Он также предлагает доступ к библиотекам .Net, которые могут быть полезны для доступа к возможностям, которые T-SQL не поддерживает.
T-SQL выполняет традиционные функции базы данных и интегрируется с оптимизатором запросов, поэтому он по-прежнему наиболее подходит для кода базы данных, ориентированного на наборы. Существуют перехватчики API для sprocs CLR, которые предоставляют информацию оптимизатору запросов, но это добавляет сложности.
Можно также использовать интеграцию CLR для определения функций, доступных для кода T-SQL. В некоторых случаях они могут быть быстрее и эффективнее с точки зрения памяти, чем функции T-SQL. Пресс-книга Wrox по интеграции с CLR обсуждает это довольно подробно.
Я приведу один хороший пример: в CLR есть встроенный объект RegEx, которого очень не хватает в SQL Server. Теперь тривиально написать функции для выполнения ограничений / исправлений проверки на основе регулярных выражений.
Я хотел бы получить ссылку на такой пример, если вы знаете один из рук.
Вы также можете, например, вызвать внешний веб-сервис из метода SQLCLR - это не совсем возможно в T-SQL :-)
Марк
Помещение блокирующего вызова к внешней службе, которая может быть или не быть доступна в коде базы данных .. Что может пойти не так?
@ConcernedOfTunbridgeWells Это не так блокирующе, как многие думают. В разделе Как SQL Server и CLR работают вместе в Размещенная среда CLR говорится (слегка отредактировано): «Код .NET выполняется в SQL Server с приоритетом. SQL Server может обнаруживать и останавливать потоки, которые не выполнялись в течение значительного периода времени. SQL Server может определять« неуправляемые »потоки CLR, управлять их приоритет, а также приостановить и вернуть их в очередь. Потоки, неоднократно определяемые как вышедшие из-под контроля, не могут выполняться в течение определенного периода времени ».
Интеграция SQLCLR / CLR в SQL Server - это просто еще один инструмент, помогающий решить некоторые (не все) проблемы. Есть несколько вещей, которые он делает лучше, чем то, что можно сделать в чистом T-SQL, а есть некоторые вещи, которые можно сделать только через SQLCLR. Я написал статью для SQL Server Central, Лестница на уровень SQLCLR 1. Что такое SQLCLR? (для чтения статей там требуется бесплатная регистрация), в которой рассматривается этот вопрос. Основы (подробности см. В связанной статье):
OPENQUERY / OPENROWSET)OPENQUERY / OPENROWSET)PRINT и RAISERROR с строгость = от 0 до 10) - я забыл упомянуть об этом в статье ;-).Еще одна вещь, которую следует учитывать, заключается в том, что иногда полезно иметь возможность совместно использовать код между приложением и БД, чтобы БД имела представление об определенной бизнес-логике без необходимости создавать настраиваемые экраны, предназначенные только для внутреннего использования, только для доступа к этому коду приложения. Например, я работал над системой, которая импортировала файлы данных от клиентов и использовала собственный хеш для большинства полей и сохраняла это значение в строке в базе данных. Это позволяло легко пропускать строки при повторном импорте их данных, поскольку приложение будет хешировать значения из входного файла и сравнивать их с хеш-значением, хранящимся в строке. Если бы они были такими же, тогда мы сразу узнали, что ни одно из полей не изменилось, поэтому мы перешли к следующей строке, и это было простое сравнение INT. Но этот алгоритм для выполнения хеширования был только в коде приложения, поэтому будь то для отладки случая клиента или поиска способов передать некоторую обработку серверным службам, пометив строки, в которых было хотя бы одно поле, с изменениями (изменения, поступающие из нашего приложения вместо того, чтобы искать изменения в новом файле импорта), я ничего не мог сделать. Это было бы прекрасной возможностью иметь довольно простую часть бизнес-логики в БД, даже если бы не для нормальной обработки; наличие того, что составляет закодированное значение в БД, без возможности понять его значение, значительно затрудняет решение проблем.
Если вам интересно увидеть некоторые из этих возможностей в действии без необходимости писать какой-либо код, бесплатная версия SQL # (автором которой я являюсь) имеет функции RegEx, настраиваемые агрегаты (UDA), настраиваемые типы (UDT) и т. д.
CLR позволяет развертывать SSISDB, что значительно улучшает анализ времени выполнения, ведение журнала успехов / сбоев / ETA, безопасность за счет меньшего количества учетных записей RDP, управление файловой системой и меньшие требования к правам, наследование резервных копий внутри планов обслуживания, полное шифрование пакетов через TDE, не говоря уже о Развертывание и обслуживание пакетов SSIS через раздел среды SSISDB и отсутствие многих функций C# в SSIS, для которых требуется среда CLR. Если вы планируете запускать правильные развертывания SSIS или C#, при создании SSISDB необходимо включить CLR.