使用TSqlParser

Opf*_*ash 20 t-sql parsing

我正在尝试使用microsoft提供的TSql100Parser解析SQL.现在我使用它似乎意图使用的方式有点麻烦.此外,缺乏文档也无济于事.(例如:http://msdn.microsoft.com/en-us/library/microsoft.data.schema.scriptdom.sql.tsql100parser.aspx)

当我通过解析器运行一个简单的SELECT语句时,它返回一个包含SELECT语句的TSqlStatements集合.麻烦的是,TSqlSelect语句不包含诸如WHERE子句之类的属性,即使该子句是作为类实现的.http://msdn.microsoft.com/en-us/library/microsoft.data.schema.scriptdom.sql.whereclause.aspx 解析器确实识别WHERE子句,查看令牌流.所以,我的问题是,我正确使用解析器吗?现在令牌流似乎是解析器最有用的功能......

我的测试项目:

public static void Main(string[] args)
{
    var parser = new TSql100Parser(false);

            IList<ParseError> Errors;
            IScriptFragment result = parser.Parse(
                new StringReader("Select col from T1 where 1 = 1 group by 1;" +
                    "select col2 from T2;" +
                    "select col1 from tbl1 where id in (select id from tbl);"),
                    out Errors);

            var Script = result as TSqlScript;

            foreach (var ts in Script.Batches)
            {
                Console.WriteLine("new batch");

                foreach (var st in ts.Statements)
                {
                    IterateStatement(st);
                }
            }
}

static void IterateStatement(TSqlStatement statement)
{
            Console.WriteLine("New Statement");

            if (statement is SelectStatement)
            {
                PrintStatement(sstmnt);
            }
}
Run Code Online (Sandbox Code Playgroud)

doz*_*oza 25

是的,您正在使用解析器.

正如Damien_The_Unbeliever所指出的,在SelectStatement中有一个QueryExpression属性,它将是第三个select语句的QuerySpecification对象(带有WHERE子句).

这表示查询的"真正的"SELECT位(而您正在查看的外部SelectStatement对象刚刚获得'WITH'子句(对于CTE),'FOR'子句(对于XML),'ORDER BY'和其他位)

所述QuerySpecification对象是与对象FromClauses,WhereClause,GroupByClause

因此,您可以使用以下方法访问WHERE子句:

((QuerySpecification)((SelectStatement)statement).QueryExpression).WhereClause
Run Code Online (Sandbox Code Playgroud)

它具有SearchCondition属性等.


Dam*_*ver 5

快速浏览一下就会发现它包含一个QueryExpression,它可能是一个QuerySpecification,它确实附加了Where子句.


小智 5

如果有人来到这里并希望知道如何获取select语句的整个元素,则以下代码解释:

QuerySpecification spec = (QuerySpecification)(((SelectStatement)st).QueryExpression);
StringBuilder sb = new StringBuilder();
sb.AppendLine("Select Elements");
foreach (var elm in spec.SelectElements)                            
  sb.Append(((Identifier)((Column)((SelectColumn)elm).Expression).Identifiers[0]).Value);

sb.AppendLine();

sb.AppendLine("From Elements");
foreach (var elm in spec.FromClauses)
  sb.Append(((SchemaObjectTableSource)elm).SchemaObject.BaseIdentifier.Value);
sb.AppendLine();

sb.AppendLine("Where Elements");
BinaryExpression binaryexp = (BinaryExpression)spec.WhereClause.SearchCondition;
sb.Append("operator is " + binaryexp.BinaryExpressionType);
if (binaryexp.FirstExpression is Column)
  sb.Append(" First exp is " + ((Identifier)((Column)binaryexp.FirstExpression).Identifiers[0]).Value);

if (binaryexp.SecondExpression is Literal)
  sb.Append(" Second exp is " + ((Literal)binaryexp.SecondExpression).Value);
Run Code Online (Sandbox Code Playgroud)