複数のSELECT文を持つSQLファイルがあります。必要な場合は、SELECT文のWHERE句があればそれを調べる必要があります。SELECTクエリのWHERE句を見つける
Select col1,col2
from table t1
where col1=2 and
convert(something)='abc'
は、クエリ上記の結果として、私は、where句完了必要と私は可能な限り一般的なように、(サブクエリは、今のように無視することができます)、それを作りたいです。私はこのコードや作業に利用できるソースコードから始めるためのいくつかの指針が必要です。どんな助けもありがとうございます。
ソリューション
私は、SQLスキーマのDOMパーサを使用して解決策を見つけ出すことができました。以下は、同じものに使用されているコードです。同じテストをした場合の動作上の問題は、必要に応じて変更できます。しかし、このコードは、指定されたSQLスクリプトが構文的に正しい場合にのみ機能します。
using System;
using System.Collections.Generic;
using System.IO;
using Microsoft.Data.Schema.ScriptDom;
using Microsoft.Data.Schema.ScriptDom.Sql;
using System.Text;
namespace ConsoleApplication1
{
internal class Program
{
public static void Main(string[] args)
{
var sql = @" SELECT Count(*) AS 'hjkhskj'
FROM ABC
SELECT DISTINCT xx AS 'kljklj'
FROM XYZ
WHERE a NOT IN (SELECT b
FROM RST)
ORDER BY 1
BEGIN TRANSACTION
DELETE FROM ABC
WHERE a NOT IN (SELECT b
FROM XYZ)
IF @@ERROR <> 0
BEGIN
ROLLBACK TRANSACTION
GOTO GTY
END
ELSE
COMMIT TRANSACTION
SELECT DISTINCT x AS 'SRTT jfkfk'
FROM PQR a
WHERE NOT EXISTS (SELECT m
FROM MYTU u
WHERE u.x = m)
ORDER BY 1 ";
//StreamReader sr = new StreamReader(@"sqlFileName.sql");
//Parse(sr.ReadToEnd());
Parse(sql);
//Console.ReadKey();
}
public static List<string> Parse(string sql)
{
TSql100Parser parser = new TSql100Parser(false);
IScriptFragment fragment;
IList<ParseError> errors;
fragment = parser.Parse(new StringReader(sql), out errors);
TSqlScript tsSs = (TSqlScript)fragment;
IList<TSqlParserToken> tknList = null;
var whereStartIndex = 0;
var whereEndIndex = 0;
var queryStartIndex = 0;
var queryEndIndex = 0;
WhereClause whereClause = null;
StreamWriter sw = new StreamWriter("test.txt");
for (int i = 0; i < tsSs.Batches.Count; i++)
{
tknList = tsSs.Batches[i].ScriptTokenStream;
for (int j = 0; j < tsSs.Batches[i].Statements.Count; j++)
{
queryStartIndex = tsSs.Batches[i].Statements[j].FirstTokenIndex;
queryEndIndex = tsSs.Batches[i].Statements[j].LastTokenIndex;
switch (tsSs.Batches[i].Statements[j].GetType().Name)
{
case ("UpdateStatement"):
whereClause = ((UpdateStatement)(tsSs.Batches[i].Statements[j])).WhereClause;
break;
case ("SelectStatement"):
whereClause = ((QuerySpecification)((SelectStatement)(tsSs.Batches[i].Statements[j])).QueryExpression).WhereClause;
break;
case ("DeleteStatement"):
whereClause = ((DeleteStatement)(tsSs.Batches[i].Statements[j])).WhereClause;
break;
default: whereClause = null;
break;
}
if (whereClause != null)
{
whereStartIndex = whereClause.FirstTokenIndex;
whereEndIndex = whereClause.LastTokenIndex;
StringBuilder sbQuery = new StringBuilder();
StringBuilder sbWhere = new StringBuilder();
for (int k = queryStartIndex; k < queryEndIndex; k++)
{
sbQuery.Append(tknList[k].Text);
if (whereStartIndex <= k && k <= whereEndIndex)
{
sbWhere.Append(tknList[k].Text);
}
}
sw.WriteLine(sbQuery.ToString());
sw.WriteLine("************************************************************************************************************");
sw.WriteLine(sbWhere.ToString());
sw.WriteLine("************************************************************************************************************");
sbQuery = null;
sbWhere = null;
}
}
}
sw.Close();
System.Diagnostics.Process.Start("test.txt");
if (errors != null && errors.Count > 0)
{
List<string> errorList = new List<string>();
foreach (var error in errors)
{
errorList.Add(error.Message);
}
return errorList;
}
return null;
}
}
}
したがって、SQL文を含むテキストファイルを解析しようとしていますか?もしそうなら、*パーサ*はどの言語で書かれますか? –
コードの作成にどの言語を使用していますか? – Naval
パラメータ化されたTSQL? –