Как я могу получить запросы в тексте хранимой процедуры SQL Server, используя лексер и парсер antrl4?

Я хочу получать запросы в тексте хранимой процедуры SQL Server, используя лексер и парсер antrl4. Например, у меня есть текст процедуры следующим образом:

ALTER PROCEDURE [dbo].[BookUpdate]
    @Name nvarchar(max),
    @BookId int,
    @PublishingHouse nvarchar(255),
    @PublicationYear smallint,
    @Authors nvarchar(255),
    @Description nvarchar(max),
    @BookShelf int,
    @UserId int,
    @Cover varbinary(max),
    @Id int OUT
AS
BEGIN
    DECLARE @haveDouble int = 0
    DECLARE @haveUser int = 1

    SELECT @haveDouble = Id 
    FROM dbo.Books 
    WHERE Name = @Name 
      AND Authors = @Authors  
      AND PublicationYear = @PublicationYear 
      AND Id != @BookId

    IF @UserId > 0
    BEGIN
        SELECT @haveUser = UserId 
        FROM dbo.Users 
        WHERE UserId = @UserId
    END

    SET @Id = 0

    IF @haveDouble = 0 AND @haveUser > 0
    BEGIN
        UPDATE dbo.Books
        SET [Name] = @Name,
            [PublishingHouse] = @PublishingHouse,
            [PublicationYear] = @PublicationYear,
            [Authors] = @Authors,
            [Description] = @Description,
            [BookShelf] = @BookShelf,
            [Cover] = @Cover,
            [UserId] = @UserId
        WHERE
            Id = @BookId

        SET @Id = @BookId
    END     
END

Я хочу получить позиции запросов "DECLARE @haveDouble int = 0", "DECLARE @haveUser int = 1" и других. Как я могу это сделать?

1 ответ

[1] SQL Server поставляется с выделенным API для анализа исходного кода T-SQL, API включен в Microsoft.SqlServer.TransactSql.ScriptDom Пространство имен. Это пространство имен включает парсеры для каждой версии SQL Server, начиная с SQL Server 2000 (= TSql80Parser).

[2] Скачать

[3] Вы должны найти все TSqlStatementс DeclareVariableStatement тип (см. Класс DeclareVariableStatement). Этот класс имеет следующие свойства (среди других свойств): StartLine, StartColumn, StartOffset, FirstTokenIndex,

[4] Пример:

using Microsoft.SqlServer.TransactSql.ScriptDom;
....

TSql120Parser SqlParser = new TSql120Parser(false);

IList<ParseError> parseErrors;
TSqlFragment result = SqlParser.Parse(new StringReader(SqlTextBox.Text),
                                      out parseErrors);

TSqlScript SqlScript = result as TSqlScript;

foreach (TSqlBatch sqlBatch in SqlScript.Batches)
{
   foreach (TSqlStatement sqlStatement in sqlBatch.Statements)
   {
      ProcessViewStatementBody(sqlStatement);
   }
}

Источник: http://www.andriescu.nl/sql/sql-how-to-parse-microsoft-transact-sql-statements-in-c_sharp_view_column_binding/

Другие вопросы по тегам