Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 创建与永久表具有相同列和类型的临时表的最佳方法_Sql_Sql Server - Fatal编程技术网

Sql 创建与永久表具有相同列和类型的临时表的最佳方法

Sql 创建与永久表具有相同列和类型的临时表的最佳方法,sql,sql-server,Sql,Sql Server,我需要创建一个临时表,其列和类型与永久表相同。最好的方法是什么?永久表有100多列 i、 e 通常我创建这样的表 DECLARE #TT TABLE( member_id INT, reason varchar(1), record_status varchar(1) , record_type varchar(1) ) 但是有没有办法不提及列名和类型,而是提及另一个包含所需列的表的名称 选择一个 select

我需要创建一个临时表,其列和类型与永久表相同。最好的方法是什么?永久表有100多列

i、 e

通常我创建这样的表

DECLARE  #TT TABLE(              
  member_id INT,    
  reason varchar(1),    
  record_status varchar(1) ,    
  record_type varchar(1)    
 ) 
但是有没有办法不提及列名和类型,而是提及另一个包含所需列的表的名称

选择一个

select top 0 *
into #mytemptable
from myrealtable
select top 0 * into #temptable from mytable

注意:这会创建temp的一个空副本,但不会创建主键。这是一个特定于MySQL的答案,不确定它还能在哪里工作-

您可以创建一个具有相同列定义的空表:

CREATE TEMPORARY TABLE temp_foo LIKE foo;
您可以使用以下内容创建现有表的填充副本:

CREATE TEMPORARY TABLE temp_foo SELECT * FROM foo;
以及以下博士后作品;不幸的是,不同的RDBMS在这里似乎不太一致:

CREATE TEMPORARY TABLE temp_foo AS SELECT * FROM foo;

我意识到这个问题非常古老,但对于寻找PostgreSQL特定解决方案的人来说,它是:

CREATE TEMP TABLE tmp_table AS SELECT * FROM original_table LIMIT 0;
注意,temp表将被放入类似pg_temp_3的模式中

这将创建一个临时表,其中包含所有不带索引和数据的列,但是根据需要,您可能需要删除主键:

ALTER TABLE pg_temp_3.tmp_table DROP COLUMN primary_key;
如果原始表中没有任何数据,可以取消0限制。

将临时表结构克隆到SQL Server中的新物理表

我们将了解如何将临时表结构克隆到SQL Server中的新物理表。这适用于Azure SQL db和内部部署

演示SQL脚本

方法1

方法2


这不是临时表,这是一个表变量。@nathangonzalez-是的,它是..更新问题。。我相信这两个答案都适用。。如有疑问,请告知not@Ananth,表变量必须显式声明,因此它最初的方式与现在一样好。可以使用select into语句创建临时表,这比手工键入更经得起时间考验,也更省时ddl@fyr,我看不出这是对那个问题的重复。他甚至没有在他的问题中提到“选择进入”,而且大部分答案都是无关的。@fyr。。我不需要数据。只需要一个具有相同模式的表,它也会插入所有数据。@nathangonzalez:我试过了,解决方案非常有效。。只是在没有任何数据的情况下创建了表。我一直对这个ID和自动递增ID有问题。当插入到临时表中时,ID被重置。+1与0=1一起移动,但您的解决方案更快。@JoachimIsaksson-只是出于兴趣,您是如何测量的?我自己做了一些粗略的测试,没有发现两者之间有什么区别。@MikaelEriksson没有做更深入的分析,但我看到了一个细微的区别,运行较旧的SQL server,top 0似乎根本无法访问表或索引,而其中0=1似乎访问主键索引。虽然不确定时间上的差异有多大,但我们没有一个庞大的表来测试。此外,这听起来相当依赖于实现,因此在较新的版本中可能会有所不同。@MikaelEriksson可以确认,2008R2似乎在时间上对这两个版本占用了相同的时间,只需要50万行以上的大表。但我没有跟踪权限的数据库,所以看不出它的计划是否相同。注意:如果myrealtable有任何计算列,它们将作为实际列插入临时表中,这通常是不可取的。如果我没有弄错的话,这里的缺点是sql server必须为表中的每一行计算11。@nathangonzalez:No,没有。优化器并没有那么笨。@ypercube,那么我想我错了。我看到它不断地扫描。我想我应该检查一下。
ALTER TABLE pg_temp_3.tmp_table DROP COLUMN primary_key;
IF OBJECT_ID('TempDB..#TempTable') IS NOT NULL
    DROP TABLE #TempTable;

SELECT 1 AS ID,'Arul' AS Names
INTO
#TempTable;

SELECT * FROM #TempTable;
SELECT * INTO TempTable1 FROM #TempTable WHERE 1=0;

EXEC SP_HELP TempTable1;
SELECT TOP 0 * INTO TempTable1 FROM #TempTable;

EXEC SP_HELP TempTable1;