表变量仅作用于批处理?为何GO语句后仍可查询@t?
批处理、会话与表变量作用域的误区
你的前两个认知完全正确:
- 表变量(如
@t)的作用域仅限声明它的批处理,跨批处理无法访问 GO是SQL Server的批处理分隔符,它会结束当前批处理,后续语句属于全新的独立批处理
问题出在你的第三个观察——这个脚本必然会报错,不存在“未抛出错误”的正常执行场景。当执行GO之后的select * from @t时,SQL Server会抛出必须声明标量变量 "@t"的错误,因为新批处理中从未声明过该表变量。
如果你的测试显示没有报错,大概率是以下情况导致的误解:
- 仅执行了
GO之前的语句段,未运行后续查询 - 测试工具的输出未完整展示错误信息
- 混淆了其他脚本的执行结果
内容的提问来源于stack exchange,提问作者J. Mini
相关产品推荐
相关产品推荐

