Я пытаюсь разобрать SQL, используя TSql100Parser, предоставленный Microsoft. Сейчас у меня есть небольшая проблема, когда я использую его так, как будто он предназначен для использования. Кроме того, отсутствие документации не помогает. (пример: http://msdn.microsoft.com/en-us/library/microsoft.data.schema.scriptdom.sql.tsql100parser.aspx)
Когда я запускаю простой оператор SELECT через парсер, он возвращает коллекцию TSqlStatements, которая содержит инструкцию SELECT. Проблема заключается в том, что оператор TSqlSelect не содержит атрибутов, таких как предложение WHERE, даже если предложение реализовано как класс. http://msdn.microsoft.com/en-us/library/microsoft.data.schema.scriptdom.sql.whereclause.aspx Парсер действительно признает предложение WHERE как таковое, глядя на токен. Итак, мой вопрос: правильно ли я использую парсер? Прямо сейчас поток токенов представляется наиболее полезной функцией анализатора...
Мой тестовый проект:
public static void Main(string[] args)
{
var parser = new TSql100Parser(false);
IList<ParseError> Errors;
IScriptFragment result = parser.Parse(
new StringReader("Select col from T1 where 1 = 1 group by 1;" +
"select col2 from T2;" +
"select col1 from tbl1 where id in (select id from tbl);"),
out Errors);
var Script = result as TSqlScript;
foreach (var ts in Script.Batches)
{
Console.WriteLine("new batch");
foreach (var st in ts.Statements)
{
IterateStatement(st);
}
}
}
static void IterateStatement(TSqlStatement statement)
{
Console.WriteLine("New Statement");
if (statement is SelectStatement)
{
PrintStatement(sstmnt);
}
}