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)的主要内容,如果未能解决你的问题,请参考以下文章

CLR SQL Server UDF 问题

如何在 CLR 函数中获取 SQL 字符串的排序规则?

在 C# 库和 C++ (CLR) 之间传递对象

SQL CLR 函数返回错误尝试使用上下文创建表和插入行

SQL 系统表

使用 SQL-CLR 函数在 SQL Server 中验证加密数据的安全性