You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 01:26:18