Erreur lors de l'parsing de T-SQL à l'aide de TSql120Parser

Bonjour stackoverflowers,

J'ai un problème lors de l'parsing des instructions T-SQL à l'aide de TSql120Parser partir de Microsoft.SqlServer.TransactSql.ScriptDom . Mon but est simplement d'parsingr une instruction select T-SQL et d'get ses jetons.

C'est la partie essentielle du problème:

 using (var reader = new SsortingngReader(query)) { IList<ParseError> errors; var parser = new TSql120Parser(true); var fragment = parser.Parse(reader, out errors); parameters.AddRange( fragment.ScriptTokenStream .Where(token => token.TokenType == TSqlTokenType.Variable) .Select(token => token.Text) .ToList()); } 

La requête de variable contient cette instruction:

 SELECT A.ColumnX, B.ColumnY FROM TableA AS A INNER JOIN TableB AS B ON A.Id = B.IdA 

Maintenant, je reçois toujours l'erreur suivante ( antlr.MismatchedTokenException.TokenTypeEnum.TokenType ):

attend "Dot", trouvé "," à la colonne 17

Depuis que je suppose que la déclaration est correcte (j'ai testé plusieurs autres instructions qui fonctionnent dans SQL-Server, mais ne sont pas analysées par le TSql120Parser), je n'ai aucune idée de ce que le problème pourrait être.

Je ne suis pas obligé d'utiliser cet parsingur, mais je pensais que ce serait la solution la plus simple et la plus robuste. J'apprécierais toute aide pour find une solution!

Cordialement, Sören

MODIFIER

Avec l'aide d'Alex K., j'ai trouvé que cela fonctionne dans une application console propre mais pas dans mon projet WPF. Il utilise le même package Nuget et .Net 4.6. Assez étrange, il parsing quelque chose comme

 SELECT @column FROM @table 

mais non

 SELECT Column FROM Table 

SOLUTION

TSql100Parser.Parse ne fonctionnait pas dans le projet mais TSql100Parser.GetTokenStream . Je ne connais pas la raison et je ne peux pas reproduire l'erreur dans un autre projet.

Merci à Alex K. et Matthew Vines pour votre aide!

Je viens de traverser un problème similaire moi-même. Essayez quelque chose de plus comme ça. mais notez que la requête que vous avez fournie n'a aucune variable. Cette requête renvoie une list de '@ 0' et '@ 1'

 SELECT product_id, AVG(sale_price) FROM Sales WHERE sale_date > @0 AND ([sales].system_id = 450) GROUP BY product_id Having AVG(sale_price) > @1 public List<ssortingng> GetVariables(ssortingng sql) { List<ssortingng> parseErrors; List<TSqlParserToken> queryTokens = TokenizeSql(sql, out parseErrors); List<ssortingng> parameters = new List<ssortingng>(); parameters.AddRange(queryTokens.Where(token => token.TokenType == TSqlTokenType.Variable) .Select(token => token.Text) .ToList()); return parameters; } private List<TSqlParserToken> TokenizeSql(ssortingng sql, out List<ssortingng> parserErrors) { using (System.IO.TextReader tReader = new System.IO.SsortingngReader(sql)) { var parser = new TSql120Parser(true); IList<ParseError> errors; var queryTokens = parser.GetTokenStream(tReader, out errors); if (errors.Any()) { parserErrors = errors.Select(e => $"Error: {e.Number}; Line: {e.Line}; Column: {e.Column}; Offset: {e.Offset}; Message: {e.Message};").ToList(); } else { parserErrors = null; } return queryTokens.ToList(); } }