为什么 Microsoft.SqlServer.Management.SqlParser.Parser 为此查询创建的 AST 包含 SqlTableValuedFunctionRefExpression?

Why the AST created by Microsoft.SqlServer.Management.SqlParser.Parser for this query contains SqlTableValuedFunctionRefExpression?

请遵守以下简单查询:

SELECT ShortName FROM Groups (nolock)

我是这样解析的:

var parseResult = Parser.Parse("SELECT ShortName FROM Groups (nolock)");
Dump(parseResult.Script);

...

private static void Dump(string indent, SqlCodeObject sqlCodeObject)
{
    Console.WriteLine(indent + sqlCodeObject.GetType().Name);
    indent += "  ";
    foreach (var child in sqlCodeObject.Children)
    {
        Dump(indent, child);
    }
}

这将输出以下 AST:

SqlScript
  SqlBatch
    SqlSelectStatement
      SqlSelectSpecification
        SqlQuerySpecification
          SqlSelectClause
            SqlSelectScalarExpression
              SqlColumnRefExpression
                OnePartObjectIdentifier
                  SqlIdentifier
          SqlFromClause
            SqlTableValuedFunctionRefExpression
              OnePartObjectIdentifier
                SqlIdentifier
              SqlColumnRefExpression
                OnePartObjectIdentifier
                  SqlIdentifier

我的问题 - 为什么 SqlFromClauseSqlTableValuedFunctionRefExpression 的父级?我在查询中没有任何函数调用。

这是我使用 SMO 150.18208.0 可以获得预期结果的唯一设置组合:

var opts = new ParseOptions("GO", true, DatabaseCompatibilityLevel.Version80);
opts.TransactSqlVersion = TransactSqlVersion.Version105;

var parseResult = Parser.Parse("SELECT ShortName FROM Groups (nolock)", opts);
Dump("  ",parseResult.Script);

产出

SqlScript
    SqlBatch
      SqlSelectStatement
        SqlSelectSpecification
          SqlQuerySpecification
            SqlSelectClause
              SqlSelectScalarExpression
                SqlColumnRefExpression
                  OnePartObjectIdentifier
                    SqlIdentifier
            SqlFromClause
              SqlTableRefExpression
                OnePartObjectIdentifier
                  SqlIdentifier
                SqlTableHint