为什么 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
我的问题 - 为什么 SqlFromClause
是 SqlTableValuedFunctionRefExpression
的父级?我在查询中没有任何函数调用。
这是我使用 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
请遵守以下简单查询:
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
我的问题 - 为什么 SqlFromClause
是 SqlTableValuedFunctionRefExpression
的父级?我在查询中没有任何函数调用。
这是我使用 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