Я знаю, что это очень старый и основной вопрос, но в моем случае это немного по-другому.
Проблема : У меня есть строка, содержащая данные, как показано ниже.
select * from table1; select col1,col2,col5 from table2; select col8 from table3;
Мне нужно найти список столбцов и имя таблицы, использованное в приведенной выше строке.
Я пробовал это с .lastIndexOf() and .SubString(), но он не дал точного результата, который мне нужен.
Желаемый результат:
Как следует извлекать указанные выше данные?
Что сказал @joe, мы можем заставить его работать для этого, однако как насчет того, если вы использовали CTE и 1000 вложенных операторов sql с объединениями, а что нет, я не думаю, что кто-то захочет нести ответственность за то, что вы калечите и травмируете людей с этим кодом
Используйте Split(), чтобы разделить его на отдельные операторы, а затем напишите код для анализа раздела между SELECT и FROM для каждого оператора, снова используйте Split для этого раздела и извлеките список имен столбцов. Мы не собираемся писать для вас парсер SQL.





Вы можете использовать этот код:
string storedProcContent = "select * from table1; select col1,col2,col5 from table2; select col8 from table3;";
Regex rx = new Regex(@"select ([\w,\*]+?) from ([\w]+)", RegexOptions.IgnoreCase|RegexOptions.Compiled);
MatchCollection matches = rx.Matches(storedProcContent);
Console.WriteLine("{0} matches found in:\n {1}",
matches.Count, storedProcContent);
foreach (Match match in matches)
{
GroupCollection groups = match.Groups;
Console.WriteLine("Table name = {0}", groups[2].Value);
Console.WriteLine("Column Used = {0}", groups[1].Value);
}
Выход:
3 matches found in:
select * from table1; select col1,col2,col5 from table2; select col8 from table3;
Table name = table1
Column Used = *
Table name = table2
Column Used = col1,col2,col5
Table name = table3
Column Used = col8
Это не основной вопрос: грамматика SQL сложна, и ее нелегко разобрать. Google по запросу "sql parser", чтобы узнать больше. Но я предполагаю, что вы хотите иметь возможность анализировать только подмножество грамматики SQL. В этом случае вам нужно определить, какое подмножество и диалекты вы хотите поддерживать. Простая возможность анализировать одну строку примера не имеет особого смысла.