SQL コードを解析してツリー構造を生成できる、無料で利用できるパーサーを推奨してもらえますか?さらに、このパーサーはツリー内の各ノードが表すステートメントのタイプを識別できますか?たとえば、ノードにループ条件が含まれる場合は、「ループ タイプ」ノードとして指定する必要があります。
もちろんです! Transact-SQL (特に Microsoft SQL Server) の場合は、Microsoft.SqlServer.Management.SqlParser.Parser
名前空間を利用できます。これは、SQL Server に含まれ、無料で配布される Microsoft.SqlServer.Management.SqlParser.dll
アセンブリに含まれています。
T-SQL を文字列として解析してトークンのシーケンスにするために使用できるメソッドの例を次に示します。
<code class="language-c#">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; }</code>
TokenInfo
クラスは、メソッドで説明されているプロパティを持つ単純なクラスです。 Tokens
は、TOKEN_BEGIN
、TOKEN_COMMIT
、TOKEN_EXISTS
などの定数を含む列挙です。
注: この名前空間は現在、別の NuGet パッケージとして次の場所で利用可能です: https://www.php.cn/link/e6e8bbe351bf19f963820a96543f25db。
以上が無料のパーサーは SQL コードからツリー構造を生成し、ステートメントの種類を識別できますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。