この記事の目的は、C# を使用して SQL コードを解析し、構文ツリーまたはその他の意味のある構造を抽出し、ツリー内の各ノードによって表されるステートメントの種類を識別することです。
Transact-SQL (Microsoft SQL Server) の場合、Microsoft.SqlServer.Management.SqlParser.Parser 名前空間は無料で使用でき、SQL コード解析機能を提供します。
文字列に格納された T-SQL を解析してトークンのシーケンスにするメソッドの例を次に示します。
<code class="language-csharp">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 は、そのプロパティがトークン情報に対応する単純なクラスであることに注意してください。トークンは、トークン タイプの列挙です (TOKEN_BEGIN、TOKEN_COMMIT など)。
Microsoft.SqlServer.Management.SqlParser 名前空間は、別の NuGet パッケージとして利用できるようになりました: https://www.php.cn/link/e6e8bbe351bf19f963820a96543f25db.
以上がC# で SQL コードを解析して構文ツリーを抽出するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。