2008-12-10 3 views
11

Предполагая следующее определение:Как вернуть nvarchar (max) в CLR UDF?

/// <summary> 
/// Replaces each occurrence of sPattern in sInput with sReplace. This is done 
/// with the CLR: 
/// new RegEx(sPattern, RegexOptions.Multiline).Replace(sInput, sReplace). 
/// The result of the replacement is the return value. 
/// </summary> 
[SqlFunction(IsDeterministic = true)] 
public static SqlString FRegexReplace(string sInput, string sPattern, 
     string sReplace) 
{ 
    return new Regex(sPattern, RegexOptions.Multiline).Replace(sInput, sReplace); 
} 

Переходя к значению nvarchar(max) для sInput с длиной> 4000 приведет значение усекается (т.е. результат вызова этого UDF является nvarchar(4000), в отличие от nvarchar(max)

ответ

24
.

о, все, что я нашел ответ сам:

/// <summary> 
/// Replaces each occurrence of sPattern in sInput with sReplace. This is done 
/// with the CLR: 
/// new RegEx(sPattern, RegexOptions.Multiline).Replace(sInput, sReplace). 
/// The result of the replacement is the return value. 
/// </summary> 
[SqlFunction(IsDeterministic = true)] 
[return: SqlFacet(MaxSize = -1)] 
public static SqlString FRegexReplace([SqlFacet(MaxSize = -1)]string sInput, 
     string sPattern, string sReplace) 
{ 
    return new Regex(sPattern, RegexOptions.Multiline).Replace(sInput, sReplace); 
} 

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

я узнал новый трюк в отношении атрибутов: они могут быть добавлены к параметрам, а также самому методу (совершенно очевидно), но также к возвращаемому значению с [return: AttributeName(Parameter=Value, ...)] Синтаксисом.

+0

Вы - звезда, сэр :) – 2010-12-14 09:16:58