从另一个表中创建SQL Server临时表

11

我想创建一个临时表,用作在编译报告时的中间表。

背景:我正在将VB6应用程序迁移到.NET。

要创建该表,可以使用...

SELECT TOP 0 * INTO #temp_copy FROM temp;

这将创建一个空的temp副本,但它不会创建主键。

有没有一种方法可以创建带有约束条件的临时表?

我应该事后创建约束条件吗?

还是最好使用create table来创建表?我不想这样做是因为表中有45个列,这会在过程中填充很多不必要的内容。

由于很多人可能同时生成报告,所以需要这个表,而不能使用单个中间表。

3个回答

7

您是否真正需要主键?如果您只需要筛选和选择报告所需的数据,那么您不管怎样都必须访问临时表中的每一行吗?


我发现在某些情况下为临时表添加索引非常有用,效果显著。可能会有中间处理或JOIN等操作。 - gbn
1
@gbn:好的,需要的时候我会添加它们。 - Mitch Wheat
你说得对,这可能是多余的。我需要检查每个过程。最初,应用程序使用了一个带有主键的单个临时表,但用户数量很少,现在我担心随着用户数量的增加,临时表将成为瓶颈。 - DeveloperChris

7
按设计,SELECT INTO 不会继承约束(PK、FK、Unique)、默认值、检查等。这是因为 SELECT INTO 实际上可以通过 FROM 子句中的联接从多个表中提取数据。由于 SELECT INTO 从您指定的表中创建一个新表,因此 SQL 无法确定您想要保留哪些约束,以及哪些约束您不想保留。
您可以编写一个过程/脚本来自动创建约束,但这可能需要付出太多的努力而获得最小的收益。

谢谢你的解释,一旦你看到原因,这似乎很明显。 - DeveloperChris

6

你必须选择以下一种方式:

  • 之后添加主键/索引
  • 显式声明临时表并带有约束条件。

与其使用 TOP 0,我也会这样做

SELECT * INTO #temp_copy FROM temp WHERE 1 = 0;

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