如何在CLR UDF中返回一个nvarchar(max)?

问题描述 投票:11回答:2

假设定义如下。

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

c# sql-server clr nvarchar
2个回答
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, ...)] 语法。


2
投票

另见 如何使用Nvarchar(max)参数创建CLR存储过程。 在这里你会发现为什么你真的应该使用SqlChars数据类型。 请看 处理CLR中的大对象(LOB)参数 在MSDN。

© www.soinside.com 2019 - 2024. All rights reserved.