临时表存在检查

时间:2012-12-11 09:34:41

标签: 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'存在。

我不知道为什么会出现这种错误?

6 个答案:

答案 0 :(得分:2)

这是一个想法

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

答案 1 :(得分:1)

请改为尝试:

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

答案 2 :(得分:1)

试试这个:

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

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

答案 3 :(得分:1)

这不是运行时错误,它是“编译时”错误

--Drop table #t1  // call this alone to ensure that it's not existing, then call the rest, nothing will be printed

Print 0

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



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

答案 4 :(得分:1)

  • SQL Server不存储具有给定名称('#t1')的临时表。 相反,它添加一个后缀,使其长128个字符。所以你 找不到'#t1'

您可以使用LIKE '#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

答案 5 :(得分:1)

您的代码实际上很好,但SQL Server中存在限制,这意味着在查询优化阶段它将失败。请参阅答案here - why does sql server think a temp table already exists when it doesnt