【问题标题】:SQL Server creating a temporary table from another tableSQL Server 从另一个表创建临时表
【发布时间】:2010-02-03 14:32:38
【问题描述】:

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

对于一些背景知识,我正在将 VB 6 应用程序移植到 .net

要创建我可以使用的表...

SELECT TOP 0 * INTO #temp_copy FROM temp;

这会创建一个临时的空副本,但不会创建主键

有没有办法创建一个临时表和约束?

之后我应该创建约束吗?

或者我最好只使用 create table 创建表,我不想这样做,因为表中有 45 列,它会在过程中填满很多不必要的东西。

该表是必需的,因为可能有很多人同时生成报告,所以我不能使用单个中间表

【问题讨论】:

    标签: sql sql-server tsql


    【解决方案1】:

    您真的需要主键吗?如果您只过滤并选择报告所需的数据,您是否不必访问临时表中的每一行?

    【讨论】:

    • 我发现在某些情况下向临时表添加索引很有用,结果令人印象深刻。可能有中间处理或JOIN等
    • @gbn:当然。我会在需要时添加它们。
    • 你是对的,它可能是多余的。我需要检查每个程序。最初应用程序使用带有主键的单个临时表,但用户数量很少,现在我担心临时表会因为用户更多而成为瓶颈
    【解决方案2】:

    按照设计,SELECT INTO 不会继承约束(PK、FK、唯一)、默认值、检查等。这是因为 SELECT INTO 实际上可以一次从多个表中提取(通过 FROM 子句中的连接)。由于 SELECT INTO 会根据您指定的表创建一个新表,因此 SQL 确实无法确定您要保留哪些约束,以及您不想保留哪些约束。

    您可以编写一个过程/脚本来自动创建约束,但这可能需要付出太多的努力才能获得最小的收益。

    【讨论】:

    • 感谢您的解释,我想一旦您看到原因就很明显了。
    【解决方案3】:

    你必须做一个或另一个:

    • 之后添加 PK/索引
    • 明确声明带有约束的临时表。

    我也会这样做,而不是 TOP 0

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-11-03
      • 1970-01-01
      • 2013-07-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多