为何创建的#payments临时表在mydb中无法通过INFORMATION_SCHEMA查询到?
问题
我编写了如下SQL脚本:
USE mydb; create table #payments ( id int, contract_ID varchar(20), payment_number int, payment_status varchar(20)); insert #payments (id, contract_id, payment_number, payment_status) values (1, 'contract1', 1, 'Processed'), (2, 'contract1', 2, 'Received'), (3, 'contract2', 1, 'Processed'), (4, 'contract2', 2, 'Approved'), (5, 'contract1', 3, 'Approved'), (6, 'contract2', 3, 'Processed');
请问该脚本是否确实在数据库mydb中创建了名为#payments的表?
第二次运行该脚本时,SSMS提示:
There is already an object named '#payments' in the database.
但执行查询语句:
USE mydb; SELECT TABLE_NAME FROM INFORMATION_SCHEMA.COLUMNS GROUP BY TABLE_NAME
却无法在结果中找到该表,这是为什么?
解答
关于第一个问题:脚本确实会创建
#payments表,但它是本地临时表,并非存放在mydb的永久表集合里,而是被创建在SQL Server的tempdb数据库中,且仅对当前执行脚本的会话可见。关于第二个问题的两个现象:
- 二次运行提示表已存在:本地临时表的生命周期与当前会话绑定,只要你没关闭当前SSMS窗口(或手动删除该临时表),它就会一直存在于
tempdb中。因此同一会话里再次执行CREATE TABLE #payments时,会触发对象已存在的提示。 INFORMATION_SCHEMA.COLUMNS查不到:这个系统视图仅展示当前数据库内的永久表信息,临时表(包括本地临时表#xxx和全局临时表##xxx)不会出现在这里。如果要查看临时表,可直接查询tempdb的系统视图,示例语句:
注意:本地临时表在SELECT name FROM tempdb.sys.tables WHERE name LIKE '#payments%'tempdb中的实际名称会自动追加一串后缀(比如#payments________________00000000004C),所以需要用模糊匹配来查询。
- 二次运行提示表已存在:本地临时表的生命周期与当前会话绑定,只要你没关闭当前SSMS窗口(或手动删除该临时表),它就会一直存在于
内容的提问来源于stack exchange,提问作者Tim
相关产品推荐
相关产品推荐

