Разбор операторов T-SQL на токены

вы можете ознакомиться здесь как красиво C#оператор кода анализирует токены. Например, следующий код:

namespace MyNamespace
{
    class MyClass
    {
        public void MyFunction(int arg1)
        {
            int var1 = arg1;
        }
    }
}

разбирается в этом:

enter image description here

Я хочу сделать что-то подобное, но с заявление. Например, если у меня есть следующее T-SQL о себе:

IIF(COALESCE([Col001], [Col002], [Col003]) > [Col004], [Col005] * [Col006] + ISNULL([Col007], [Col008]), CONCAT(SUBSTRING([Col009], 0, 3), 'sample text', [Col010]))

даст мне что-то вроде этого:

IIF, COALESCE, ISNULL, CONCAT, SUBSTRING    - functions 
[Col001], [Col002], ... , [Col010]          - columns 
0, 3, 'sample text'                         - variables

или в случае I есть:

ISNULL([Col001], [Col002], [Col003])

структура с ошибками:

[The isnull function requires 2 argument(s).] - error

нет никаких бесплатных или платных современных решений, и, похоже, использование Microsoft parser является лучшим решением здесь. Как я прочитал, мне нужно использовать Microsoft.От SQLServer.Управление.SqlParser.Парсер пространство имен, но нет никаких примеров, и я не смог разделить T-SQL заявление, как мне нравится. Кроме того, он работает только с полными утверждениями (вам нужно SELECT предложения для например, и мне нужно использовать его только для фрагментов кода).

могу ли я сделать это с помощью этого пространства имен или лучше начать писать C# класс для моих нужд, а?

1 ответов


мне пришлось добавить ссылку вручную в csproj

Microsoft.От SQLServer.Управление.SqlParser, Version=12.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91

как

<Reference Include="Microsoft.SqlServer.Management.SqlParser, Version=12.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91" />

простой пример:

string sql = "IIF(COALESCE([Col001], [Col002], [Col003]) > [Col004], [Col005] * [Col006] + ISNULL([Col007], [Col008]), CONCAT(SUBSTRING([Col009], 0, 3), 'sample text', [Col010]))";

var po = new ParseOptions { };
var scanner = new Scanner(po);
scanner.SetSource(sql, 0);

Tokens token;
int state = 0;
int start;
int end;
bool isPairMatch;
bool isExecAutoParamHelp;

while ((token = (Tokens)scanner.GetNext(ref state, out start, out end, out isPairMatch, out isExecAutoParamHelp)) != Tokens.EOF)
{
    string str = sql.Substring(start, end - start + 1);
    Console.WriteLine("{0}: {1}", token, str);
}

взято из http://www.sqlservercentral.com/blogs/dave_ballantynes_blog/2012/03/13/parsing-t-sql-the-easy-way/

обратите внимание, что этот анализатор распознает определенное количество функции (например,IIF, COALESCE, ...). Непризнанные функции просто помечаются как TOKEN_ID, как имена столбцов.