1

这个问题让我难倒了好几天。这是我第一次涉足 CLR 和 UDF ......

我创建了一个用户定义的函数,该函数将多行字符串作为输入,对其进行扫描并在找到时将字符串中的某一行替换为替代行。如果没有找到,它只是在末尾附加所需的行。(见代码)

当最终的 String(或 Stringbuilder)转换为 SqlString 或 SqlChars 时,问题似乎出现了。转换后的返回字符串始终包含 Nul 字符作为每隔一个字符(通过控制台输出查看,它们显示为空格)。

我可能缺少有关 UDF 和/或 CLR 的一些基本内容。

请帮忙!!

代码(我留在评论过的 Stringbuilder 中,这是我最初的尝试...更改为普通 String 以拼命寻找问题):

 [Microsoft.SqlServer.Server.SqlFunction]
[return: SqlFacet(MaxSize = -1, IsFixedLength = false)]
//public static SqlString udf_OmaChangeJob(String omaIn, SqlInt32 jobNumber) {
public static SqlChars udf_OmaChangeJob(String omaIn, SqlInt32 jobNumber) {

    if (omaIn == null || omaIn.ToString().Length <= 0) return new SqlChars("");
    String[] lines = Regex.Split(omaIn.ToString(), "\r\n");

    Regex JobTag = new Regex(@"^JOB=.+$");
    //StringBuilder buffer = new StringBuilder();
    String buffer = String.Empty;
    bool matched = false;

    foreach (var line in lines) {
        if (!JobTag.IsMatch(line))
            //buffer.AppendLine(line);
            buffer += line + "\r\n";
        else {
            //buffer.AppendLine("JOB=" + jobNumber);
            buffer += ("JOB=" + jobNumber + "\r\n");
            matched = true;
        }
    }
    if (!matched) //buffer.AppendLine("JOB=" + jobNumber);
        buffer += ("JOB=" + jobNumber) + "\r\n";

    //return new SqlString(buffer.ToString().Replace("\0",String.Empty)) + "blablabla";
   // buffer = buffer.Replace("\0", "|");
    return new SqlChars(buffer + "\r\nTheEnd");

}
4

1 回答 1

0

我知道根据我的经验,omaIn 参数应该是 SqlString 类型,当你去收集它的值/处理它时,设置一个局部变量:

string omaString = omaIn != SqlString.Null ? omaIn.Value : string.empty;

然后,当您返回任何代码路径时,要在 C# 中重新包装字符串,您需要设置

return omaString == string.empty ? new SqlString.Null : new SqlString(omaString);

我参加了一些有趣的摔跤比赛,学习了本地和出站类型之间的复杂切换,尤其是使用 CLR TVF。

希望能有所帮助!

于 2014-07-18T14:04:21.140 回答