【问题标题】:SQL Server : stating temp table exists, but it's not in INFORMATION_SCHEMASQL Server:声明临时表存在,但它不在 INFORMATION_SCHEMA 中
【发布时间】:2020-02-13 15:58:03
【问题描述】:

我正在使用以下内容来检查和创建表:

IF NOT EXISTS(SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'tempdb' AND TABLE_NAME LIKE '#tmp_items%')
    CREATE TABLE #tmp_items 
    (
        id               INT IDENTITY(1,1),
        inv_mast_uid     INT DEFAULT NULL,
        src_invoice      BIT DEFAULT NULL,
        src_invoice_date DATETIME DEFAULT NULL,
        src_order        BIT DEFAULT NULL,
        src_order_date   DATETIME DEFAULT NULL
    )
ELSE
    TRUNCATE TABLE #tmp_items

我收到以下错误:

数据库中已经有一个名为“#tmp_items”的对象。

如果它存在,它应该截断表......

当我查看INFORMATION_SCHEMA 时,我什么也没看到:

SELECT DISTINCT TABLE_SCHEMA FROM INFORMATION_SCHEMA.TABLES

返回:

ssb
UTIL
mbl
DataSync
dbo

SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME LIKE '%tmp_items%'

什么都不返回。

这没有意义,我不知所措...我什至断开了与服务器的连接(应该清除了临时表)并重新连接,但仍然出现相同的错误。

我错过了什么吗?

【问题讨论】:

  • 我记得在 SQL Server 中,INFORMATION_SCHEMA 只查看您当前的数据库,但临时表存储在临时数据库中。我认为OBJECT_ID() 经常用于检查是否存在。
  • 据我了解,INFORMATION_SCHEMA 是首选方式。是的,它看的是当前数据库,但是表schema是tempdb,在当前数据库下。
  • 你能用这个看看反应是什么吗?使用 tempdb go select * from INFORMATION_SCHEMA.TABLES where TABLE_CATALOG = 'tempdb' and TABLE_NAME like '#tmp_items%' go
  • TABLE_SCHEMA 列与表属于哪个数据库无关。它是表所属的模式。并且它不应该用于检查模式,因为它并不总是正确的。 docs.microsoft.com/en-us/sql/relational-databases/… 对象的默认架构是 dbo。

标签: sql sql-server information-schema


【解决方案1】:

无论您如何切片,您都将难以有条件地截断或创建这样的临时表。更改此项以删除临时表(如果存在),然后始终创建它。这要简单得多。

IF OBJECT_ID('tempdb..#tmp_items%') is not null
    drop table #tmp_items

CREATE TABLE #tmp_items 
(
    id                  int         identity(1,1),
    inv_mast_uid        int         DEFAULT NULL,
    src_invoice         bit         DEFAULT NULL,
    src_invoice_date    datetime    DEFAULT NULL,
    src_order           bit         DEFAULT NULL,
    src_order_date      datetime    DEFAULT NULL
)

【讨论】:

  • 好的,这行得通。我曾经使用 OBJECT_ID,但有人告诉我现在使用 INFORMATION_SCHEMA 是“首选”方式。这不是真的,还是 OBJECT_ID 仅适用于临时表?
  • 我不会使用 INFORMATION_SCHEMA 来检查任何对象的存在。不知道是谁这么说的,也不知道为什么他们认为这是正确的。请注意,在 MS 文档中,他们甚至说它们不准确。它们在那里是为了向后兼容。 “INFORMATION_SCHEMA 视图可能不完整,因为它们并未针对所有新功能进行更新。”事实上,有很多理由不将它们用于任何事情。 sqlblog.org/2011/11/03/…
  • @SeanLange,我赞成您的评论和您的回答,但本着全面披露的精神,我经常使用 INFORMATION_SCHEMA(尽管从不用于对象存在)。通常用于列列表。
猜你喜欢
  • 2018-09-23
  • 1970-01-01
  • 1970-01-01
  • 2011-03-02
  • 1970-01-01
  • 2017-07-19
  • 2013-12-02
  • 1970-01-01
  • 2023-03-06
相关资源
最近更新 更多