Der beste Weg, um eine temporäre Tabelle mit denselben Spalten zu erstellen und als permanente Tabelle einzugeben

72

Ich muss eine temporäre Tabelle mit denselben Spalten erstellen und als permanente Tabelle eingeben. Was ist der beste Weg, um es zu tun? (Die permanente Tabelle enthält über 100 Spalten.)

dh

Normalerweise erstelle ich eine solche Tabelle.

DECLARE  #TT TABLE(              
  member_id INT,    
  reason varchar(1),    
  record_status varchar(1) ,    
  record_type varchar(1)    
 ) 

Aber gibt es eine Möglichkeit, dies zu tun, ohne die Spaltennamen und den Typ zu erwähnen, aber den Namen einer anderen Tabelle mit den erforderlichen Spalten zu erwähnen?

Ananth
quelle
1
Das ist keine temporäre Tabelle, das ist eine Tabellenvariable.
Nathan Gonzalez
@ Nathangonzalez- Ja, es ist ... Aktualisierung der Frage. Ich glaube, die Antworten gelten für beide. Bitte klären Sie, wenn nicht
Ananth
@Ananth, Tabellenvariablen müssen explizit deklariert werden, so wie es ursprünglich war, ist es ungefähr so ​​gut wie es nur geht. temporäre Tabellen können mit einer select intoAnweisung erstellt werden , die zukunftssicherer und weniger zeitaufwendig ist als die manuelle Eingabe des ddl
nathan gonzalez
1
@fyr, ich sehe nicht, wie dies ein Duplikat dieser Frage ist. er erwähnt nicht einmal select intoin seiner Frage, und die meisten Antworten dort sind irrelevant.
Nathan Gonzalez
@fyr .. Ich brauche die Daten nicht .. Benötige nur eine Tabelle mit dem gleichen Schema
Ananth

Antworten:

138
select top 0 *
into #mytemptable
from myrealtable
Nathan Gonzalez
quelle
1
+1 ging mit einem "wobei 0 = 1", aber Ihre Lösung ist schneller.
Joachim Isaksson
1
@ JoachimIsaksson - Nur aus Interesse, wie haben Sie das gemessen? Ich habe selbst einige grobe Tests durchgeführt und sehe keinen Unterschied zwischen den beiden.
Mikael Eriksson
1
@MikaelEriksson Ich habe keine eingehendere Analyse durchgeführt, aber ich habe einen kleinen Unterschied festgestellt. Es wurde ein älterer SQL-Server ausgeführt, und Top 0 scheint überhaupt nicht auf Tabellen oder Indizes zuzugreifen, während 0 = 1 auf den Primärschlüsselindex zuzugreifen scheint. Ich bin mir nicht sicher, wie groß der zeitliche Unterschied ist, habe aber keinen riesigen Tisch zum Testen. Dies klingt auch ziemlich implementierungsabhängig und kann daher in neueren Versionen unterschiedlich sein.
Joachim Isaksson
1
@MikaelEriksson Kann bestätigen, dass 2008R2 (zeitlich gesehen) für beide mit einer großen Tabelle (50M + Zeilen, nur PK) dieselbe Zeit benötigt. Keine Datenbank, in der ich Trace-Berechtigungen habe, daher kann ich nicht sehen, ob sie identisch geplant ist.
Joachim Isaksson
1
Hinweis: Wenn myrealtableberechnete Spalten vorhanden sind, werden diese als echte Spalten in die temporäre Tabelle eingefügt, was im Allgemeinen unerwünscht ist.
Steve Guidi
14

Mir ist klar, dass diese Frage extrem alt ist, aber für alle, die nach einer spezifischen Lösung für PostgreSQL suchen, ist es:

CREATE TEMP TABLE tmp_table AS SELECT * FROM original_table LIMIT 0;

Beachten Sie, dass die temporäre Tabelle in ein Schema wie pg_temp_3 eingefügt wird.

Dadurch wird eine temporäre Tabelle erstellt, die alle Spalten (ohne Indizes) und ohne Daten enthält. Abhängig von Ihren Anforderungen möchten Sie jedoch möglicherweise den Primärschlüssel löschen:

ALTER TABLE pg_temp_3.tmp_table DROP COLUMN primary_key;

Wenn die ursprüngliche Tabelle zunächst keine Daten enthält, können Sie die "LIMIT 0" weglassen.

Brooks
quelle
9

Dies ist eine MySQL-spezifische Antwort, nicht sicher, wo es sonst funktioniert -

Sie können eine leere Tabelle mit denselben Spaltendefinitionen erstellen mit:

CREATE TEMPORARY TABLE temp_foo LIKE foo;

Und Sie können eine aufgefüllte Kopie einer vorhandenen Tabelle erstellen mit:

CREATE TEMPORARY TABLE temp_foo SELECT * FROM foo;

Und das Folgende funktioniert in Postgres; Leider scheinen die verschiedenen RDBMS hier nicht sehr konsistent zu sein:

CREATE TEMPORARY TABLE temp_foo AS SELECT * FROM foo;
gcbenison
quelle
8

Sortest one ...

select top 0 * into #temptable from mytable

Hinweis: Dadurch wird eine leere Kopie von temp erstellt, es wird jedoch kein Primärschlüssel erstellt

Pranay Rana
quelle
Dadurch werden auch alle Daten eingefügt.
Nathan Gonzalez
@ Nathanathonzalez: Ich habe es versucht und die Lösung hat perfekt funktioniert. Nur die Tabelle wurde ohne Daten erstellt
Ananth
Ich habe Probleme mit diesen und automatisch inkrementierenden IDs. Beim Einfügen in die temporäre Tabelle werden die IDs zurückgesetzt.
Ryan The Leach
1
select * into #temptable from tablename where 1<>1
Rashmi Kant Shrivastwa
quelle
Wenn ich mich nicht irre, ist der Nachteil hier, dass SQL Server 1 <> 1 für jede Zeile in der Tabelle auswerten muss.
Nathan Gonzalez
4
@nathangonzalez: Nein, hat es nicht. Der Optimierer ist nicht so dumm.
Ypercubeᵀᴹ
@ypercube, dann denke ich, ich irre mich. Ich sehe, es macht einen konstanten Scan. Angenommen, ich hätte nachsehen sollen.
Nathan Gonzalez
0

Klonen Sie die temporäre Tabellenstruktur in eine neue physische Tabelle in SQL Server

Geben Sie hier die Bildbeschreibung ein

Wir werden sehen, wie die temporäre Tabellenstruktur in eine neue physische Tabelle in SQL Server geklont wird. Dies gilt sowohl für Azure SQL-Datenbank als auch für lokale Datenbanken.

Demo-SQL-Skript

IF OBJECT_ID('TempDB..#TempTable') IS NOT NULL
    DROP TABLE #TempTable;

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

SELECT * FROM #TempTable;

METHODE 1

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

EXEC SP_HELP TempTable1;

Geben Sie hier die Bildbeschreibung ein

Methode 2

SELECT TOP 0 * INTO TempTable1 FROM #TempTable;

EXEC SP_HELP TempTable1;

Geben Sie hier die Bildbeschreibung ein

Arulmouzhi
quelle