2008-12-10 44 views
11

假设以下定义:如何在CLR UDF中返回nvarchar(max)?

/// <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