[英]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類 )。 此類具有以下屬性(除其他屬性外): 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/
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.