SQL CLR 用户定义函数 (C#) 在返回的字符串中的每个现有字符之间添加空字符 (\0)
Posted
技术标签:
【中文标题】SQL CLR 用户定义函数 (C#) 在返回的字符串中的每个现有字符之间添加空字符 (\\0)【英文标题】:SQL CLR User Defined Function (C#) adds null character (\0) in between every existing character in String being returnedSQL CLR 用户定义函数 (C#) 在返回的字符串中的每个现有字符之间添加空字符 (\0) 【发布时间】:2014-04-23 10:53:03 【问题描述】:这个问题让我难过了几天。 这是我第一次涉足 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");
【问题讨论】:
.Net 字符串是encoded UTF16,即每个字符 2 个字节? 听起来像是一个潜在的原因。我给函数一个 varchar(所以 8 位)值...... C# String 想要 16 位......所以也许在转换为 16 位期间添加了 nul 的某个地方? 对不起所有...我认为这完全是红鲱鱼...在错误的地方寻找问题。在删除此问题之前,我会仔细检查。 不,不是红鲱鱼......我现在已经绕过 CLR......如果有人遇到这个线程有一个或两个想法......请分享。 你需要调用变量的“.IsNull”属性作为这个链接:[处理CLR中的空输入][1][1]:***.com/questions/4541886/… 【参考方案1】:根据我的经验,omaIn 参数应该是 SqlString 类型,当你去收集它的值/处理它时,设置一个局部变量:
string omaString = omaIn != SqlString.Null ? omaIn.Value : string.empty;
然后,当您返回任何代码路径时,要在 C# 中重新包装字符串,您需要设置
return omaString == string.empty ? new SqlString.Null : new SqlString(omaString);
我参加了一些有趣的摔跤比赛,学习了本地和出站类型之间的复杂切换,尤其是使用 CLR TVF。
希望能帮到你!
【讨论】:
以上是关于SQL CLR 用户定义函数 (C#) 在返回的字符串中的每个现有字符之间添加空字符 (\0)的主要内容,如果未能解决你的问题,请参考以下文章