为何Microsoft.SqlServer.Management.SqlParser解析SQL生成含SqlTableValuedFunctionRefExpression的AST
问题原因
这是使用的SQL解析器对SQL Server特有省略语法适配不足导致的,具体逻辑如下:
- 你写的
Groups (nolock)属于SQL Server的兼容写法:表提示(nolock)省略了前置的WITH关键字,标准ANSI SQL以及大多数通用SQL解析器识别的表提示写法为Groups WITH (nolock),省略WITH属于SQL Server独有的非标准兼容语法。 - 不带
WITH的表名 (参数)结构,和表值函数调用的语法格式完全一致,解析器无法区分该结构是「省略WITH的表提示」还是「表值函数调用」,所以默认匹配了优先级更高的表值函数调用规则,将该节点识别为SqlTableValuedFunctionRefExpression。
解决方案
- 写法层面补全
WITH关键字,调整查询为:
SELECT ShortName FROM Groups WITH (nolock)
调整后解析器就能正确识别为「普通表引用+表提示」的结构,不会再误判为表值函数调用。
- 如果你需要兼容这种SQL Server特有的省略写法,可以更换为适配SQL Server方言的专用SQL解析器,这类解析器会内置对省略
WITH表提示的识别规则。
内容的提问来源于stack exchange,提问作者mark
相关产品推荐
相关产品推荐

