簡體   English   中英

如何使用antrl4 lexer和解析器在SQL Server存儲過程文本中獲取查詢?

[英]How can I get queries in a SQL Server stored procedure text using antrl4 lexer and parser?

我想使用antrl4 lexer和解析器在SQL Server存儲過程文本中獲取查詢。 例如,我的過程文本如下:

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] SQL Server帶有用於解析T-SQL源代碼的專用API,該API包含在Microsoft.SqlServer.TransactSql.ScriptDom命名空間中。 此命名空間包括從SQL Server 2000(= TSql80Parser )開始的每個SQL Server版本的解析器。

[2] 下載

[3]你必須找到所有TSqlStatement小號具有DeclareVariableStatement類型(見DeclareVariableStatement類 )。 此類具有以下屬性(除其他屬性外): StartLineStartColumnStartOffsetFirstTokenIndex

[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/

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM