Должен ли я использовать SqlString или строку в качестве типа параметра для UDF SQLCLR - PullRequest
3 голосов
/ 01 марта 2012

В чем разница между типами данных Sqlxxx и их эквивалентами .NET?

Например, почему и когда я должен использовать SqlString, а не string?

Ответы [ 2 ]

3 голосов
/ 10 июля 2015

По возможности, вы должны использовать типы SqlTypes для параметров метода SQLCLR. Существует только 4 типа данных SQL Server, которые не имеют типа Sql*****:

  • TIME: используйте TimeSpan или TimeSpan?
  • DATETIME2: используйте DateTime или DateTime?
  • DATETIMEOFFSET: используйте TimeZoneOffset или TimeZoneOffset?
  • SQL_VARIANT: используйте object (NULL приходит как DbNull.Value)

Для получения дополнительной информации см. Следующую страницу MSDN: Отображение данных параметров CLR

Некоторые различия между SqlString и string (которые важны в определенных ситуациях) заключаются в том, что SqlString:

  • сохраняет кодировку, определенную по умолчанию COLLATION базы данных, в которой существует сборка, и
  • содержит свойства, описывающие LCID и SqlCompareOptions (то есть чувствительность к регистру, чувствительность к акценту и т. Д.), Как это определено по умолчанию COLLATION базы данных, в которой существует сборка. Использование string (или даже SqlChars) потеряло бы эту информацию.
  • имеет методы для возврата byte[] - GetUnicodeBytes и GetNonUnicodeBytes - тогда как string имеет ToCharArray. NVARCHAR исходные данные кодируются как UTF-16, который будет использовать либо 2 байта, либо 4 байта для каждого символа, в зависимости от символа.
  • правильно обрабатывает T-SQL NULL с. Это можно проверить с помощью логического свойства IsNull (которое есть у всех типов Sql*). При возврате в качестве возвращаемого значения или значения столбца для TVF используйте статическое свойство SqlString.Null (которое имеется во всех типах Sql*).

Когда дело доходит до отправки больших значений в параметрах NVARCHAR(MAX) и VARBINARY(MAX), вы можете фактически передавать значения из SQL Server в CLR SQL Server, используя типы SqlChars и SqlBytes соответственно. В некоторых случаях использование потоковой передачи намного эффективнее (при условии, что вам не нужно все значение одновременно). Кроме того, если к параметру никогда не обращаются, то никакие данные не передаются вообще, в отличие от использования SqlString и SqlBinary, соответственно.

Соответствующую информацию можно найти в статье, которую я написал для серии по SQLCLR: Лестница к SQLCLR Уровень 5: Разработка (Использование .NET в SQL Server) (требуется бесплатная регистрация).

0 голосов
/ 04 марта 2012

Большая разница - обработка нуля и сопоставление. Посмотрите на ссылку ниже. Я предлагаю использовать типы sqlclr для параметров и возвращаемых типов. Обычно вы можете работать с этими типами во всем теле функции.

http://msdn.microsoft.com/en-us/library/ms131049(v=sql.100).aspx

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