执行USE <database>会清除已声明变量吗?跨库切换后表变量数据保留吗?
关于
USE语句与表变量作用域的问题 嘿,刚接触SQL的话确实容易被GO和变量作用域搞混,我来给你掰扯清楚这个问题:
首先直接给结论:切换数据库本身(USE <database>)不会清除已声明的变量,但GO命令会结束当前批处理,而局部变量(包括你用的表变量@table)的作用域仅限于定义它的那个批处理内。
咱们结合你的场景一步步拆解:
- 第一步:
USE <database 1>; GOGO是SQL Server客户端工具(比如SSMS)的批处理分隔符,这一行执行完,第一个批处理就结束了。这个批处理里没有定义变量,所以没影响。 - 第二步:
DECLARE @table TABLE(ID INT); ... --向@table插入数据
这是第二个独立的批处理(因为前面有GO),你在这里定义的@table只在这个批处理里有效。只要你还没遇到下一个GO,哪怕中间执行其他操作(比如查询、修改数据),都能正常使用这个变量。 - 第三步:
USE <database 2>; GO
这是第三个批处理,当你执行GO的时候,第二个批处理就彻底结束了——SQL Server会销毁这个批处理里定义的所有局部变量,包括你的@table。所以切换到database 2之后,你根本无法访问之前的@table,更别说获取里面的数据了。
额外补充个小知识点:如果去掉GO,把所有语句放在同一个批处理里,比如:
USE database1; DECLARE @table TABLE(ID INT); INSERT INTO @table VALUES(1); USE database2; SELECT * FROM @table; -- 这里是可以正常查询到数据的
这种情况下,USE只是切换当前数据库上下文,但整个脚本是一个批处理,变量@table的作用域覆盖整个批处理,所以能正常访问。
总结一下:变量的存活与否和USE无关,关键看GO——只要遇到GO,当前批处理的变量就会被销毁,跨批处理无法共享局部变量。
内容的提问来源于stack exchange,提问作者sassy_rog
相关产品推荐
相关产品推荐

