You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何创建的#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数据库中,且仅对当前执行脚本的会话可见。

  • 关于第二个问题的两个现象:

    1. 二次运行提示表已存在:本地临时表的生命周期与当前会话绑定,只要你没关闭当前SSMS窗口(或手动删除该临时表),它就会一直存在于tempdb中。因此同一会话里再次执行CREATE TABLE #payments时,会触发对象已存在的提示。
    2. INFORMATION_SCHEMA.COLUMNS查不到:这个系统视图仅展示当前数据库内的永久表信息,临时表(包括本地临时表#xxx和全局临时表##xxx)不会出现在这里。如果要查看临时表,可直接查询tempdb的系统视图,示例语句:
      SELECT name FROM tempdb.sys.tables WHERE name LIKE '#payments%'
      
      注意:本地临时表在tempdb中的实际名称会自动追加一串后缀(比如#payments________________00000000004C),所以需要用模糊匹配来查询。

内容的提问来源于stack exchange,提问作者Tim

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 15:45:32