Как я могу получить запросы в тексте хранимой процедуры 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);
}
}