Почему мы используем процедуры CLR - PullRequest
3 голосов
/ 12 января 2010

Почему мы используем процедуры CLR. Есть ли какое-либо значение процедур CLR или какого-либо примера, где процедура CLR является единственным решением?

Ответы [ 5 ]

18 голосов
/ 12 января 2010

Представьте, что вы хотите проверить некоторые из ваших полей данных в SQL Server с помощью регулярного выражения. На сегодняшний день даже в SQL Server 2008 R2 это практически невозможно с помощью только кода T-SQL.

Однако, с небольшой помощью хранимой процедуры или хранимой функции CLR, это будет очень просто.

T-SQL очень силен, когда дело доходит до манипулирования наборами данных - используйте его для этого.

CLR очень сильна в других областях, таких как манипуляции со строками и датами, вызов внешних служб (WCF, веб-службы).

Таким образом, хранимые процедуры T-SQL и хранимые процедуры CLR являются хорошим дополнением - каждая решает определенный набор задач, с которыми другая не особенно хороша.

2 голосов
/ 18 июля 2014

Я отправил следующий ответ на аналогичный вопрос: Преимущество SQL SERVER CLR . Я добавлю сюда, хотя, учитывая, что что-то было упомянуто по крайней мере в 2 ответах: C # / VB.net / etc - это язык, с которым кому-то удобнее, чем T-SQL, , а не должно быть причиной для использования SQLCLR по T-SQL. Если кто-то не знает, как что-то сделать в T-SQL, сначала обратитесь за помощью в поиске решения T-SQL. Если он не существует, , тогда идите по маршруту CLR.


SQLCLR / CLR Интеграция в SQL Server - это еще один инструмент, помогающий решить некоторые (не все) проблемы. Есть несколько вещей, которые он делает лучше, чем то, что можно сделать в чистом T-SQL, и есть некоторые вещи, которые можно сделать только через SQLCLR. Я написал статью для SQL Server Central, Stairway to SQLCLR Level 1: Что такое SQLCLR? (для чтения статей там требуется бесплатная регистрация), в которой рассматривается этот вопрос. Основы (см. Связанную статью для деталей):

  • Потоковые функции с табличным значением (sTVF)
  • Динамический SQL (в функциях и триггерах - доступ к таблицам inserted и deleted)
  • Улучшение доступа к внешним ресурсам / замена xp_cmdshell
    • Передача данных проще
    • Проще вернуть несколько столбцов из набора результатов
    • Нет внешних зависимостей (например, 7zip.exe)
    • Лучшая защита через олицетворение
  • Возможность многопоточности
  • Обработка ошибок (в пределах функций)
  • Пользовательские агрегаты
  • Пользовательские типы
  • Изменить состояние (внутри функции и без OPENQUERY / OPENROWSET)
  • Выполнить хранимую процедуру (только для чтения; внутри функции и без OPENQUERY / OPENROWSET)
  • Производительность ( примечание: это не означает во всех случаях, но определенно в некоторых случаях в зависимости от типа и сложности операции)
    • вычисления / манипуляции со строками
    • UDF SQLCLR, если они помечены DataAccess = None, могут использоваться в параллельных планах выполнения, тогда как UDF T-SQL предотвращают параллельные планы
  • Может захватывать выходные данные (то есть то, что отправляется на вкладку «Сообщения» в SSMS) (например, PRINT и RAISERROR с серьезностью = от 0 до 10) - я забыл упомянуть об этом в статья; -).

Еще одна вещь, которую следует учитывать, это то, что иногда полезно иметь возможность обмениваться кодом между приложением и БД, чтобы БД понимала определенную бизнес-логику, не создавая собственные экраны, предназначенные только для внутреннего использования, просто для доступа к ним. код приложения. Например, я работал над системой, которая импортировала файлы данных от клиентов и использовала собственный хэш большинства полей и сохранила это значение в строке в БД. Это позволило легко пропустить строки при повторном импорте их данных, поскольку приложение будет хэшировать значения из входного файла и сравнивать с хеш-значением, хранящимся в строке. Если они были одинаковыми, то мы сразу знали, что ни одно из полей не изменилось, поэтому мы перешли к следующему ряду, и это было простое сравнение с INT. Но этот алгоритм для выполнения хеширования был только в коде приложения, так что будь то для отладки клиентского случая или для поиска способов переложить некоторую обработку на внутренние сервисы, помечая строки, в которых было хотя бы одно поле с изменениями (изменения поступили из нашего приложения в отличие от поиска изменений в более новом файле импорта), я ничего не мог сделать. Это было бы отличной возможностью иметь довольно простую часть бизнес-логики в БД, даже если бы не обычная обработка; наличие того, что равнозначно закодированному значению в БД, и неспособность понять его значение, значительно затрудняет решение проблем.

Если вы заинтересованы в том, чтобы увидеть некоторые из этих возможностей в действии без необходимости писать какой-либо код, бесплатная версия SQL # (автором которой я являюсь) имеет функции RegEx, пользовательские агрегаты (UDA), пользовательские типы (UDT) и т. д.

2 голосов
/ 12 января 2010

Есть несколько вещей, которые нельзя сделать в SQL Server (или, в некоторых случаях, не так, как в управляемом коде).

  • CLR имеет RegEx .
  • Вы можете позвонить в веб-сервисы.
  • CLR имеет лучшую производительность (например, если вам приходилось выполнять много математических операций в каждом ряду)
  • Повторное использование кода
  • Пишите на языке, к которому вы привыкли (VB.Net, C # и т. Д.).
0 голосов
/ 12 января 2010

Если вы хотите выполнить некоторые нетривиальные математические вычисления или вызвать внешние веб-службы или что-то подобное, вы не можете сделать это из T-SQL, и хранимая процедура или функция .Net будет действительно полезна для решения .

Вы также можете написать агрегатные функции с помощью процедур CLR, что невозможно сделать в T-SQL.

Конечно, для манипулирования данными хранимые процедуры T-SQL работают лучше и их легче писать.

0 голосов
/ 12 января 2010

Ну, если хотите:

  • для выполнения сложных операций с данными и
  • хотят быть ближе к данным (то есть не в ASP.NET или приложении Winforms) и
  • вы бы предпочли писать код на C #, чем на SQL.

Это тот случай, когда вы используете процедуру CLR. У меня нет примера с макушки головы, но его можно себе представить.

- Изменить:

Вообразимым может быть преобразование данных в структуру типа хранилища данных. В этом случае вы можете переформатировать и выполнить небольшой анализ. Тогда может быть целесообразно сделать это в CLR. (Я не предполагаю, что это именно то, что я бы сделал, но это можно рассмотреть).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...