Подтвердить что ты не робот

Как вернуть 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).

4b9b3361

Ответ 1

О, независимо от того, я сам нашел ответ:

/// <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, ...)].