T-SQL (varchar (max) против CLR (строка, SqlString, SqlChars)?

У меня есть проблема, которую я не могу решить. Я использую SQL Server 2005, C# CLR для использования внешней dll. Проблема в длине параметра. Мне нужно использовать в качестве параметра функции тип varchar(max). Если в коде C# я использую string, SqlSring, я не могу использовать тип T-SQL varchar(max), только varchar(4000) из nvarchar(4000). Я должен сказать, что могут быть ситуации, когда мне нужно использовать более 4000 символов, поэтому мне нужно знать, какой тип C # мне нужно использовать для varchar(max).

Я прочитал много статей, и в нескольких из них говорится, что для этого я могу использовать SqlChars. Но! У меня есть манипуляции со строками. Как я могу иметь действия с string или SqlString, а затем конвертировать в SqlChars? (Возможно SqlChars.ToString() или SqlChars.ToSqlString()).

Я не нашел для этого кода С#.


person Chaki_Black    schedule 28.09.2011    source источник
comment
Строка varchar(max), использующая максимальную емкость, не будет загружаться в строку CLR, поскольку она исчерпает адресное пространство. Можете ли вы более подробно указать, какие действия вы хотите выполнить с этими строками?   -  person Damien_The_Unbeliever    schedule 28.09.2011
comment
Я конвертирую любой тип SQL в varchar и отправляю это значение во внешнюю dll. Затем проделайте с ним манипуляции и вернитесь на SQL Server. Теперь я использую SQL/vchar(4000) и C#/string. Мне нужно более 4000 символов.   -  person Chaki_Black    schedule 28.09.2011
comment
@Damien_The_Unbeliever: у меня сложилось впечатление, что и экземпляр SQL Server varchar(max), и экземпляр .NET string могут иметь размер до 2 ГБ....   -  person marc_s    schedule 28.09.2011
comment
@marc_s - как оказалось, переменная varchar(max) может содержать более 2 ГБ. Но я в основном работал с другой стороны. Конечно, в 32-битной CLR вы не можете выделить объект размером 2 ГБ, и я думаю, что вы можете бороться даже с 64-битной.   -  person Damien_The_Unbeliever    schedule 30.09.2011


Ответы (3)


Что вам нужно сделать, это добавить атрибут SqlFacet(MaxSize = -1) к параметру:

[return: SqlFacet(MaxSize = -1)]
[Microsoft.SqlServer.Server.SqlFunction(IsDeterministic = true)]
public static SqlString YourSqlFunction([SqlFacet(MaxSize = -1)]SqlString sourceSS)
{ return new }
person Kolya Evdokimov    schedule 12.04.2014
comment
Правильный! Это заставит VS автоматически создать правильный скрипт! - person Mike Keskinov; 24.09.2014

Я нашел ответ. Не только я задавался этим вопросом. надо внимательнее посты читать...

Можно прочитать здесь http://social.msdn.microsoft.com/Forums/is/sqlnetfx/thread/391ebb98-e1b5-47fc-a72d-9f1e39829e3a Проблема совместимости с CLR решается не очень сложно.

Все время я хотел использовать varchar(max) и пытался использовать C# типы string, SqlString, SqlChars. Необходимо использовать T-SQL nvarchar(max), и вы можете использовать любой из типов C# string, SqlString, SqlChars!

Конечно, nvarchar занимает больше места, чем varchar в два раза.

person Chaki_Black    schedule 29.09.2011
comment
SQLCLR не допускает VARCHAR, будь то 1–4000 или MAX. NVARCHAR — это единственный тип строки, через который проходит API SQLCLR (ну, я думаю, object/SQL_VARIANT также может передавать строку до 4000). Если вы передаете значения VARCHAR, они неявно преобразуются в NVARCHAR. Пожалуйста, не используйте и не предлагайте использовать string в качестве типа входного или выходного параметра SQLCLR. Дополнительные сведения см. в моей серии статей Stairway to SQLCLR в SQL Server Central (бесплатно для этого сайта требуется регистрация). - person Solomon Rutzky; 30.12.2015

Попробуйте использовать длину -1. Что-то вроде этого:

cmd.Parameters.Add("@param", SqlDbType.VarChar, -1).Value = "hdfiophdopigherog";
person Tom Chantler    schedule 28.09.2011
comment
Я не могу попробовать это, потому что у меня нет SqlCommand... Просто входной параметр - манипуляция с ним - выходной параметр. И мне нужны параметры IN/OUT будут SqlChars - person Chaki_Black; 28.09.2011
comment
Хотя -1 технически правильный, этот ответ по-прежнему не имеет отношения к вопросу. Этот ответ касается API SqlConnection, а не API SQLCLR. - person Solomon Rutzky; 30.12.2015