Sql 临时表存在性检查

Sql 临时表存在性检查,sql,sql-server,Sql,Sql Server,我在SQL Server中尝试了以下代码,但遇到了一个奇怪的错误: IF OBJECT_ID(N'tempdb..#t1') IS NULL BEGIN CREATE TABLE #t1( F1 DATE NOT NULL ) END IF OBJECT_ID(N'tempdb..#t1') IS NULL BEGIN CREATE TABLE #t1( F1 DATE NOT NULL ) END 错误: #t1’存在 我不知道为什么会发生这种错误 这是一个好主意 IF O

我在SQL Server中尝试了以下代码,但遇到了一个奇怪的错误:

IF OBJECT_ID(N'tempdb..#t1') IS NULL
BEGIN
CREATE TABLE #t1(
    F1 DATE NOT NULL
)
END

IF OBJECT_ID(N'tempdb..#t1') IS NULL
BEGIN
CREATE TABLE #t1(
    F1 DATE NOT NULL
)
END
错误:

#t1’存在

我不知道为什么会发生这种错误

这是一个好主意

IF OBJECT_ID(N'tempdb..#t1') IS NULL
BEGIN
   CREATE TABLE #t1( F1 DATE NOT NULL )
END
GO

IF OBJECT_ID(N'tempdb..#t1') IS NULL
BEGIN
   CREATE TABLE #t1( F1 DATE NOT NULL )
END
GO
请尝试以下方法:

IF NOT exists(SELECT 1
              FROM information_schema.columns 
              WHERE table_name LIKE '#t1%')
BEGIN
CREATE TABLE #t1(
    F1 DATE NOT NULL
)
END
试试这个:

IF Not EXISTS (select * from sys.objects where Name = 'tempdb..#t1')

BEGIN
CREATE TABLE #t1(
    F1 DATE NOT NULL
)
END

这不是运行时错误,而是“compiletime”错误

  • SQL Server不存储具有给定名称的临时表(
    “#t1”
    )。 相反,它添加了一个后缀,使其长度为128个字符。所以你 找不到
    “#t1”
您可以使用像“#t1%”这样的
来查找它

IF NOT EXISTS (select * from tempdb.sys.tables where name like '#t1%')
  • 您还应该在第一次查询后添加
    GO
    ,以标记批次结束
使用它如下

--DROP TABLE #t1
--GO

    IF OBJECT_ID(N'tempdb..#t1') IS NULL
    BEGIN
    CREATE TABLE #t1(
        F1 DATE NOT NULL
    )
    END
    GO

    IF NOT EXISTS(select * from tempdb.sys.tables where name like '#t1%')
    BEGIN
    CREATE TABLE #t1(
        F1 DATE NOT NULL
    )
    END

您的代码实际上很好,但SQL Server中存在一个限制,这意味着在查询优化阶段它将失败。请查看答案。

在执行第一个create table之前,似乎正在评估IF子句,如果在第一个IF…END之后放置GO语句,则不会收到错误。谢谢!现在我知道需要“走”。
--DROP TABLE #t1
--GO

    IF OBJECT_ID(N'tempdb..#t1') IS NULL
    BEGIN
    CREATE TABLE #t1(
        F1 DATE NOT NULL
    )
    END
    GO

    IF NOT EXISTS(select * from tempdb.sys.tables where name like '#t1%')
    BEGIN
    CREATE TABLE #t1(
        F1 DATE NOT NULL
    )
    END