如何用Microsoft.SqlServer.Management.SqlParser获取SQL的Select/From/Where子句
解决Microsoft.SqlServer.Management.SqlParser解析SQL获取SELECT/FROM/WHERE子句的问题
你的代码存在两个核心问题:一是selectStmt的空值判断位置错误,未提前过滤非SELECT语句易引发空引用;二是部分子句的处理方式不当(比如对FromClause错误使用String.Join)。以下是修正后的代码,可正确获取SELECT、FROM、WHERE及ORDER BY子句内容:
Imports Microsoft.SqlServer.Management.SqlParser.Parser Imports Microsoft.SqlServer.Management.SqlParser.SqlCodeDom Imports Microsoft.SqlServer.Management.SqlParser.SqlCodeObjectModel Dim sqlQuery As String = "SELECT Champ1 FROM MA_TABLE WHERE Champ1 = 'TITI' ORDER BY Champ2" Dim parseOptions As ParseOptions = New ParseOptions() Dim parseResult As ParseResult = Parser.Parse(sqlQuery, parseOptions) If parseResult.Errors.Count = 0 Then Dim script = parseResult.Script For Each batch In script.Batches For Each statement In batch.Statements Dim selectStmt As SqlSelectStatement = TryCast(statement, SqlSelectStatement) ' 先判断是否为SELECT语句,避免空引用 If selectStmt IsNot Nothing Then ' 获取SELECT子句的列/元素 Dim columnList As String = String.Join(", ", selectStmt.SelectSpecification.SelectElements.Select(Function(c) c.ToString())) Console.WriteLine("SELECT子句: " & columnList) ' 获取FROM子句 If selectStmt.SelectSpecification.FromClause IsNot Nothing Then Dim fromClause As String = selectStmt.SelectSpecification.FromClause.ToString() Console.WriteLine("FROM子句: " & fromClause) End If ' 获取WHERE子句 If selectStmt.SelectSpecification.WhereClause IsNot Nothing Then Dim whereClause As String = selectStmt.SelectSpecification.WhereClause.ToString() Console.WriteLine("WHERE子句: WHERE " & whereClause) End If ' 获取ORDER BY子句 If selectStmt.SelectSpecification.OrderByClause IsNot Nothing Then Console.WriteLine("ORDER BY子句: " & selectStmt.SelectSpecification.OrderByClause.ToString()) End If End If Next Next Else Console.WriteLine("解析查询时出错:") For Each Error_found In parseResult.Errors Console.WriteLine(Error_found.Message) Next End If
关键说明:
- SELECT子句:通过
SelectElements集合遍历所有选择项,每个项的ToString()会返回对应的表达式(包括列名、聚合函数、别名等),用String.Join拼接成逗号分隔的列表。 - FROM子句:
FromClause对象的ToString()直接返回完整的FROM子句内容(含表名、连接语句等),无需额外拼接。 - WHERE子句:
WhereClause.ToString()返回的是WHERE后的条件部分,因此需要手动添加"WHERE "前缀以得到完整子句。 - 空值判断:所有子句对象都需先判断是否为
Nothing,避免因SQL中缺少对应子句引发异常。
内容的提问来源于stack exchange,提问作者8oris
相关产品推荐
相关产品推荐

