単調な振戦 (振戦せん妄と手根管症候群の中間) に悩まされないように、SQL ステートメントとそのパラメーター値の大きなファイルの解析を自動化する方法を見つける必要があります。
次の形式の膨大な数の SQL ステートメントを含むファイルがあります。
select Animal#, RacketThreshold, PeakOil as Oil
from OilAnimalPlatypus2
where OilAnimalPlatypusID = :ID
and Animal# = :Animal
and TelecasterAccessType = 'D'
UNION
select Animal, RacketThreshold, PeakOil as Oil
from OilRequestPlatypus
where PlatypusID = :ID
and Animal = :Animal
order by RacketThreshold
-->ID(VARCHAR[0])=<NULL>
:Animal(INTEGER)=2
...つまり、複数行の sql ステートメントの後に空白行が続き、その後に 2 つのダッシュとパラメーター名、データ型、および引数を含む矢印が続き、その後に同じことが無限に繰り返されます (SQL ステートメントにパラメーターなし)。
この大量のゴミから、一意のクエリごとに個別の文字列を作成したいと思います (多くの場合、params に異なる引数値が割り当てられていますが、それらの多くは同じです)。可能であれば、特定のクエリに渡されたすべての引数値を追跡したいと思います (たとえば、最初に呼び出されて特定のパラメーターに「1」が渡された場合、次回は「42」、次回は「3.14」など)、その引数名に1、42、3.14のコレクションが必要です。
400 を超えるクエリがありますが、これをすべて「手作業」で行うという考えは嫌いです。特に、一致するクエリを比較する場合はそうです。
更新しました
さて、Jon を使用するためにこのコードを追加した後:
private void buttonOpenAndParseSQLMonFile_Click(object sender, EventArgs e)
{
var queriesAndArgs = (Dictionary<string, List<string>>)ParseFile("SQLMonTraceLog.txt");
foreach(var pair in queriesAndArgs)
{
richTextBoxParsedResults.AppendText(pair.Key);
richTextBoxParsedResults.AppendText(Environment.NewLine);
foreach (String s in pair.Value)
{
richTextBoxParsedResults.AppendText(s);
richTextBoxParsedResults.AppendText(Environment.NewLine);
}
richTextBoxParsedResults.AppendText(Environment.NewLine);
}
}
...リッチテキスト ボックスで次のような結果が得られます。
select ABCID from ABCWorker where lower(loginid) = lower(user)
select r.roleid from abcrole r, abcworker w where lower(w.loginid)=lower(user) and r.abcid=w.abcid and r.status='A'
select Tier#, BenGrimm, PeakRate as Ratefrom RageAnimalGreenBayPackers2 where RageAnimalGreenBayPackersID = :ID and Tier# =
:Tier and FlyingVAccessType = 'D' UNION select Tier, BenGrimm, PeakRate as Rate from CaliforniaCondorGreenBayPackers where
GreenBayPackersID = :ID and Tier = :Tier order by BenGrimm
--> :ID(VARCHAR[0])=<NULL> :Tier(INTEGER)=1
--> :ID(VARCHAR[0])=<NULL> :Tier(INTEGER)=1
--> :ID(VARCHAR[0])=<NULL> :Tier(INTEGER)=1
--> :ID(VARCHAR[0])=<NULL> :Tier(INTEGER)=4
select Tier#, BenGrimm, PeakRate as Rate from RageAnimalGreenBayPackers2 where RageAnimalGreenBayPackersID = :ID and Tier# =
:Tier and FlyingVAccessType = 'D' UNION select Tier, BenGrimm, PeakRate as Rate from CaliforniaCondorGreenBayPackers where
GreenBayPackersID = :ID and Tier = :Tier order by BenGrimm
--> :ID(VARCHAR[0])=<NULL> :Tier(INTEGER)=2
--> :ID(VARCHAR[0])=<NULL> :Tier(INTEGER)=5
--> :ID(VARCHAR[0])=<NULL> :Tier(INTEGER)=1
--> :ID(VARCHAR[0])=<NULL> :Tier(INTEGER)=2
--> :ID(VARCHAR[0])=<NULL> :Tier(INTEGER)=3
--> :ID(VARCHAR[0])=<NULL> :Tier(INTEGER)=4
--> :ID(VARCHAR[0])=<NULL> :Tier(INTEGER)=2
--> :ID(VARCHAR[0])=<NULL> :Tier(INTEGER)=3
--> :ID(VARCHAR[0])=<NULL> :Tier(INTEGER)=4
(etc.)
...だから、これは非常に有益でしたが、私が必要としているものはそれほど多くないことがわかりました。さらに、ファイルの lamo 手動微調整に依存しています。SO、一歩下がって、実際に与えられたファイルを解析する必要があると思います。各「興味深い」イベントを区切る数字を増やします。
. . .
6 11:30:46 SQL Execute: select ABCID
from ABCWorker
where lower(loginid) = lower(user)
7 11:30:46 SQL Prepare: select r.roleid from abcrole r, abcworker w where lower(w.loginid)=lower(user) and
r.abcid=w.abcid and r.status='A'
8 11:30:46 SQL Execute: select r.roleid from abcrole r, abcworker w where lower(w.loginid)=lower(user) and
r.abcid=w.abcid and r.status='A'
9 11:30:46 SQL Execute: select Tier#, BenGrimm, PeakRate as Rate
from RageAnimalGreenBayPackers2
where RageAnimalGreenBayPackersID = :ID
and Tier# = :Tier
and FlyingVAccessType = 'D'
UNION
select Tier, BenGrimm, PeakRate as Rate
from CaliforniaCondorGreenBayPackers
where GreenBayPackersID = :ID
and Tier = :Tier
order by BenGrimm
10 11:30:46 :ID(VARCHAR[0])=<NULL>
:Tier(INTEGER)=1
11 11:30:46 SQL Execute: select Tier#, BenGrimm, PeakRate as Rate
from RageAnimalGreenBayPackers2
where RageAnimalGreenBayPackersID = :ID
and Tier# = :Tier
and FlyingVAccessType = 'D'
UNION
select Tier, BenGrimm, PeakRate as Rate
from CaliforniaCondorGreenBayPackers
where GreenBayPackersID = :ID
and Tier = :Tier
order by BenGrimm
12 11:30:46 :ID(VARCHAR[0])=<NULL>
:Tier(INTEGER)=2
. . .