如果再次创建临时表并添加列名,将无法选择额外的列名。

3
虽然我已经删除了临时表,但是如果创建了与原表同名但是具有附加列名称的临时表,它仍然不允许我选择新的列名称。我一直在使用SQL Server 2008。请尝试以下示例代码:
IF (object_id('tempdb..#xyz') IS NOT NULL)
    DROP TABLE #xyz;

CREATE TABLE #xyz(
     [a] [datetime] NULL,
     [b] [nvarchar](255) NULL,
     [c] [nvarchar](255) NULL
) ON [PRIMARY]
GO

IF (object_id('tempdb..#xyz') IS NOT NULL)
    DROP TABLE #xyz;

CREATE TABLE #xyz(
     [a] [datetime] NULL,
     [b] [nvarchar](255) NULL,
     [c] [nvarchar](255) NULL,
     [d] [nvarchar](255) NULL
) ON [PRIMARY]

SELECT [d] FROM  #xyz

这段话的意思是:
Msg 207, Level 16, State 1, Line 13
Invalid column name 'd'.

如果我们像Martin Parkin提到的那样选择*,它将返回带有列名d的结果。

我无法为我的动态列选择*,也无法选择其他列。

为什么呢?

Fiddle


你是否收到了错误信息,还是通过其他方式确定它不允许你创建表格?如果你收到了实际的SQL Server错误信息,那有时会给出实际问题的很好提示。 - spencer7593
1
你可能需要使用“GO”来分隔查询:在每个“DROP TABLE”后面放置一个“GO”(不过要在“if”之外)。 - Blorgbeard
2
此外,实际上您并没有像通常创建临时表那样创建一个临时表。临时表存储在tempdb中,它们的名称以“#”开头。您正在创建一个真正的表,但将其用作临时表。 - Blorgbeard
2
在它们之间加一个GO。整个SQL块一次性被编译,temp_process.dbo.xyx表的定义是基于第一个select into推断出来的。编译非常基础,不足以注意到您删除和重新创建表的情况。使用GO分离编译单元。 - John Gibb
@MartinParkin:请尝试单独执行这些代码块。 - hsuk
显示剩余12条评论
1个回答

2
您需要使用GO来分隔DROPCREATE语句。它们需要在不同的批次中执行。
IF (object_id('tempdb..#xyz') IS NOT NULL)
DROP TABLE #xyz;

CREATE TABLE #xyz(
     [a] [datetime] NULL,
     [b] [nvarchar](255) NULL,
     [c] [nvarchar](255) NULL
) ON [PRIMARY]
GO

IF (object_id('tempdb..#xyz') IS NOT NULL)
DROP TABLE #xyz;

GO

CREATE TABLE #xyz(
     [a] [datetime] NULL,
     [b] [nvarchar](255) NULL,
     [c] [nvarchar](255) NULL,
     [d] [nvarchar](255) NULL
) ON [PRIMARY]

SELECT [d] FROM  #xyz

@hsuk,我更新了我的答案并进行了测试。但请不要改变你的问题,因为这会使所有评论和可能的答案都过时。 - Szymon
哦,对不起,我只是不得不改变问题以在这里复制问题。之前的例子对每个人都有效。无论如何,已经注意到了... - hsuk

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接