1

これは、私を数日間困惑させ続けています。CLRとUDFに手を出すのは初めてです...

複数行の文字列を入力として受け取り、それをスキャンして、文字列内の特定の行が見つかった場合は別の行に置き換えるユーザー定義関数を作成しました。見つからない場合は、目的の行を末尾に追加するだけです。(コードを参照)

問題は、最終的な String (または Stringbuilder) が SqlString または SqlChars に変換されるときに発生するようです。変換されて返される文字列には、常に 1 文字おきに Nul 文字が含まれます (コンソール出力を介して表示すると、スペースとして表示されます)。

UDF や CLR の基本的なものが欠けている可能性があります。

助けてください!!

コード(最初の試みであるコメント付きのStringbuilderを残します...問題を見つけるための必死の試みで通常の文字列に変更しました):

 [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 に答える