C# での SQL コードの解析
質問: C# を使用して SQL コードを解析し、ツリー構造を生成する方法それとも他の構造物ですか?また、パーサーは、入れ子構造の正しいツリー構造を生成し、ツリー構造内のノードによって表されるステートメント タイプを返す必要があります。たとえば、ノードにループ条件が含まれている場合、ノードは「ループ タイプ」として返される必要があります。
答え:
Transact-SQL (Microsoft SQL Server) の場合は、SQL Server にある Microsoft.SqlServer.Management.SqlParser.Parser 名前空間を使用できます。これは、付属のアセンブリ Microsoft.SqlServer.Management.SqlParser.dll で提供され、自由に配布できます。
次に、T-SQL を文字列として解析して一連のトークンにするメソッドの例を示します。
IEnumerable<TokenInfo> ParseSql(string sql) { ParseOptions parseOptions = new ParseOptions(); Scanner scanner = new Scanner(parseOptions); int state = 0, start, end, lastTokenEnd = -1, token; bool isPairMatch, isExecAutoParamHelp; List<TokenInfo> tokens = new List<TokenInfo>(); scanner.SetSource(sql, 0); while ((token = scanner.GetNext(ref state, out start, out end, out isPairMatch, out isExecAutoParamHelp)) != (int)Tokens.EOF) { TokenInfo tokenInfo = new TokenInfo() { Start = start, End = end, IsPairMatch = isPairMatch, IsExecAutoParamHelp = isExecAutoParamHelp, Sql = sql.Substring(start, end - start + 1), Token = (Tokens)token, }; tokens.Add(tokenInfo); lastTokenEnd = end; } return tokens; }
TokenInfo クラスは、上で参照したプロパティを備えた単なる単純なクラスであることに注意してください。 。
トークンは次の列挙です:
には、TOKEN_BEGIN、TOKEN_COMMIT、TOKEN_EXISTS およびその他の定数が含まれます。
更新: は別の nuget パッケージになりました: [Microsoft.SqlServer.Management.SqlParser](https://www.nuget.org/packages/Microsoft.SqlServer.Management.SqlParser) )。
以上がC# で SQL コードを解析してツリー構造を生成する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。