SQLCLR Типы хранимых процедур

1

Я решил создать хранимую процедуру SQLCLR для замены хранимой процедуры SQL Server из-за сложности.

Вопрос: существует ли какой-либо тип данных или ограничения API при написании хранимых процедур CLR? Если это так, может кто-нибудь дать мне какие-либо решения.

Я планирую использовать var, List<T>, DataTable, DataRow[] и Queue с несколькими способами расширения LINQ.

Теги:
sql-server
stored-procedures
sqlclr
sqldatatypes

1 ответ

2
Лучший ответ

На самом деле это довольно открытый вопрос, так как есть нюансы в том, что можно сделать в самом коде.NET/CLR и какие типы данных могут/должны использоваться в качестве параметров ввода/вывода.

Начиная с основ, нюансы зависят от того, какую версию SQL Server вы используете, и какой конкретный вопрос задают.

Версии.NET Framework

  • Смешанный режим не допускается: только одна версия CLR может использоваться в CLR-сервере SQL Server, а версия CLR зависит от версии SQL Server и не может быть изменена
  • SQL Server 2005, 2008 и 2008 R2: Статически привязана к CLR 2.0
  • SQL Server 2012, 2014 и 2016: Статически привязан к CLR 4.0

Библиотеки.NET Framework и сопоставления типов данных

SQL Server 2005

Поддерживаемые библиотеки.NET Framework :

  • CustomMarshalers
  • Microsoft.VisualBasic
  • Microsoft.VisualC
  • mscorlib
  • система
  • Конфигурация системы
  • System.Data
  • System.Data.OracleClient
  • System.Data.SqlXml
  • System.Deployment
  • System.Security
  • System.Transactions
  • System.Web.Services
  • System.Xml

Типы данных:

SQL Server 2008, 2008 R2, 2012, 2014 и 2016:

Поддерживаемые библиотеки.NET Framework : (добавлено 2 библиотеки, как указано ниже)

  • CustomMarshalers
  • Microsoft.VisualBasic
  • Microsoft.VisualC
  • mscorlib
  • система
  • Конфигурация системы
  • System.Data
  • System.Data.OracleClient
  • System.Data.SqlXml
  • System.Deployment
  • System.Security
  • System.Transactions
  • System.Web.Services
  • System.Xml
  • System.Core.dll (добавлен в SQL Server 2008)
  • System.Xml.Linq.dll (добавлен в SQL Server 2008)

Типы данных:

Разный

  • Что касается типов данных: если имеется доступный тип Sql* (например, SqlInt32), используйте его; не используйте тип.NET в методе С# для входных параметров (например, int или Int32). Используйте только собственный тип.NET, если для типа данных SQL Server не существует типа Sql*. Два общих экземпляра этого исключения используют object (который может быть DbNull.Value) для сопоставления с SQL_VARIANT и DateTime/DateTime? которые отображаются в DATETIME2.
  • Вы можете ссылаться/использовать сторонние сборки, а также библиотеки Framework за пределами перечисленных выше, но затем вам необходимо импортировать их с PERMISSION_SET UNSAFE в базу данных, в которой также находится ваш код. Вам также, вероятно, необходимо будет установить базу данных в TRUSTWORTHY ON, чтобы установить их в UNSAFE потому что это не представляется возможным (не так, чтобы я мог найти, так или иначе) для создания асимметричного ключа из предоставленных Microsoft DLL.
  • Вообще говоря, все, что написано против.NET 2.0, так что оно работает в SQL Server 2005, должно работать в любой из более поздних версий SQL Server. Мне еще предстоит встретить что-то, что работает в.NET 2.0 в 2005 году, которое не работает ни в одной из версий, которые появятся после 2005 года.
  • Вы не можете передавать табличные параметры (TVP) в объект на основе SQLCLR (хранимая процедура, функция и т.д.). Этот момент, а также некоторые другие полезные сведения отмечены в документации MSDN для хранимых процедур CLR
  • Я не видел никаких проблем при использовании List<T>, DataTable и DataRow[].
  • Я не использовал Queue или var но не ожидал никаких проблем при их использовании.
  • Прошло много лет с тех пор, как я попробовал LINQ но, похоже, вспомнил единственную проблему, заключающуюся в том, что он не был включен в набор поддерживаемых библиотек Framework SQL Server 2005, так что это не помогло мне, поскольку мне нужно поддерживать 2005 - 2014, но для любой, кто не должен беспокоиться о SQL Server 2005, должен быть в порядке.
  • Для получения дополнительной информации о теме SQLCLR у меня есть серия статей по SQL Server Central (требуется бесплатная регистрация): Stairway to SQLCLR

Ещё вопросы

Сообщество Overcoder
Наверх
Меню