2016-03-31 5 views
1

Ich muss mehrere Tabellenvariablen in eine temporäre Tabelle einfügen.Fügen Sie eine Tabellenvariable in eine temporäre Tabelle mit mehreren Spalten ein (ID, Nummer usw.)

Einer der Tabellenvariablen ist:

DECLARE @@TempTable_Number TABLE (Number bigint) 

insert into @@TempTable_Number (Number) values ('000000000000'); 
insert into @@TempTable_Number (Number) values ('100000000000'); 

Dies ist nur eine Tabelle zum Einfügen Variable arbeitet

select * into ##GlobalTempTable_1 from @@TempTable_Number 

Ich habe ein paar mehr Tabellenvariablen wie

DECLARE @@TempTable_ID TABLE (Number int) 

insert into @@TempTable_ID (ID) values ('1'); 
insert into @@TempTable_ID (ID) values ('12'); 

usw. ..

habe ich versucht, diese in eine TempTable Daten aus mehreren Variablen-Tabelle einzufügen:

Select * into ####GlobalTempTable_1 From @@TempTable_ID, @@TempTable_Number; 

Die Abfrage geht in eine kontinuierliche Schleife ...

EDIT:

einer der Tabellen Variablen :

DECLARE @@TempTable_Number TABLE (Number bigint, ID int) 

insert into @@gvTempTable (Number) values ('21212321332332'); 
insert into @@gvTempTable (Number) values ('100000000000'); 
insert into @@gvTempTable (ID) values ('1'); 
insert into @@gvTempTable (ID) values ('12'); 

select * into ##GlobalTempTable from @@gvTempTable; 
select * from ##GlobalTempTable; 

Dies gibt eine Art von kartesisches Produkt

Result sets

+0

Ihr Beispiel ungerade ist. Zuerst speichern Sie 'bigint/int', stellen aber Strings zur Verfügung. Keine große Sache (implizite Konvertierung wird damit umgehen). Zweitens hat Ihre '@@ TempTable_ID' eine ungültige 'INSERT INTO'-Anweisung (Spaltennamen' Number' <> 'ID'). – lad2025

+0

Es ist ein Tippfehler, ich Fleisch ID in der zweiten Spalte zu verwenden. Ich habe meine Frage aktualisiert, danke nochmal. – enigma6205

+0

Bitte bearbeiten Sie keine Frage, wie Sie es getan haben, da Sie vorhandene Antworten ungültig machen. Wenn Sie eine Klarstellung hinzufügen möchten, markieren Sie sie deutlich.Zweitens ist Ihre Bearbeitung eine neue Frage und sollte separat gestellt werden. – lad2025

Antwort

3

Verwenden UNION ALL:

SELECT ID 
INTO ##GlobalTempTable_1 
FROM @@TempTable_ID 
UNION ALL 
SELECT Number 
FROM @@TempTable_Number; 

LiveDemo


Select * into ####GlobalTempTable_1 From @@TempTable_ID, @@TempTable_Number; 

Die Abfrage geht in eine Endlosschleife ...

Es ist wahrscheinlich nicht Schleife, aber sehr lange Abfrage. Denken Sie daran, dass Sie Cartesian product tun.

So Ihre Anfrage ist die gleiche wie:

SELECT * 
INTO ##GlobalTempTable_1 
FROM @@TempTable_ID 
CROSS JOIN @@TempTable_Number; 

Und das Ergebnis ist NxM Datensätze, bei denen N Anzahl der Datensätze in der ersten Tabelle und M in der zweiten.

+0

Danke für die Antwort. Aber es produziert ein anderes Ergebnis als das, was ich erwarte. Ich änderte meine vorherige Abfrage, die ich wirklich nah, aber nicht 100% – enigma6205

+0

Ich tat folgendes: DECLARE @@ TempTable TABELLE (Nummer bigint, ID int) Einfügen in @@ gvTempTable (Anzahl) Werte ('00000000000000'); Einfügen in @@ gvTempTable (Anzahl) Werte ('00000000000012'); Einfügen in @@ gvTempTable (ID) Werte ('1'); Einfügen in @@ gvTempTable (ID) Werte ('12'); Wählen Sie * in ## TempTable Von @@ gvTempTable – enigma6205

+0

Die Ergebnismenge gibt immer noch kartesischen Produkt in zwei Spalten, aber ich brauche ID und NUMBER als eine Zeile zurückgeben nicht NULL für alle IDs und dann für alle Zahlen separat zurückgeben. – enigma6205

0

Versuchen Sie, wie diese,

DECLARE @TempTable TABLE (
    ID INT 
    ,Number BIGINT 
    ) 

INSERT INTO @TempTable (Number) 
VALUES ('21212321332332'); 

INSERT INTO @TempTable (Number) 
VALUES ('100000000000'); 

INSERT INTO @TempTable (ID) 
VALUES ('1'); 

INSERT INTO @TempTable (ID) 
VALUES ('12'); 

--select * into #GlobalTempTable from @@gvTempTable; 
--select * from ##GlobalTempTable; 
SELECT * 
FROM @TempTable 

SELECT A.ID 
    ,B.Number 
FROM (
    SELECT ID 
     ,ROW_NUMBER() OVER (
      ORDER BY ID 
      ) TempId 
    FROM @TempTable 
    WHERE id IS NOT NULL 
    ) A 
INNER JOIN (
    SELECT number 
     ,ROW_NUMBER() OVER (
      ORDER BY id 
      ) TempId 
    FROM @TempTable 
    WHERE number IS NOT NULL 
    ) B ON A.TempId = B.TempId