C#中的SQL程式碼解析
問題:如何使用C#解析SQL程式碼,並產生樹形結構或任何其他結構?解析器也應產生嵌套結構的正確樹形結構,並傳回樹形結構中節點所表示的語句類型。例如,如果節點包含循環條件,則應傳回該節點為「循環類型」。
解答:
對於Transact-SQL(Microsoft SQL Server),可以使用Microsoft.SqlServer.Management.SqlParser.ParserSQL中附帶的組件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中文網其他相關文章!