0

我在 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' 存在。

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

4

6 回答 6

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
于 2012-12-11T09:39:42.663 回答
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
于 2012-12-11T10:01:46.027 回答
1

您的代码实际上很好,但是 SQL Server 中存在一个限制,这意味着在查询优化阶段它会失败。请在此处查看答案 - 为什么 sql server 认为临时表已经存在而不存在

于 2012-12-11T10:02:24.157 回答
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
于 2012-12-11T09:51:23.740 回答
1

试试这个:

IF NOT exists(SELECT 1
              FROM information_schema.columns 
              WHERE table_name LIKE '#t1%')
BEGIN
CREATE TABLE #t1(
    F1 DATE NOT NULL
)
END
于 2012-12-11T09:39:59.867 回答
1

试试这个:

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

BEGIN
CREATE TABLE #t1(
    F1 DATE NOT NULL
)
END
于 2012-12-11T09:42:21.560 回答