这个问题让我难倒了好几天。这是我第一次涉足 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");
}