これは、私を数日間困惑させ続けています。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");
}