it-swarm.com.de

SELECT INTO eine Tabellenvariable in T-SQL

Ich habe eine komplexe SELECT-Abfrage, aus der ich alle Zeilen in eine Tabellenvariable einfügen möchte, aber T-SQL lässt dies nicht zu.

Entsprechend können Sie eine Tabellenvariable nicht mit SELECT INTO- oder INSERT EXEC-Abfragen verwenden. http://odetocode.com/Articles/365.aspx

Kurzes Beispiel:

declare @userData TABLE(
                        name varchar(30) NOT NULL,
                        oldlocation varchar(30) NOT NULL
                       )

SELECT name, location
INTO @userData
FROM myTable
    INNER JOIN otherTable ON ...
WHERE age > 30

Die Daten in der Tabellenvariablen werden später verwendet, um sie wieder in verschiedene Tabellen einzufügen/zu aktualisieren (meistens eine Kopie derselben Daten mit geringfügigen Aktualisierungen). Das Ziel dabei wäre, das Skript ein bisschen lesbarer und einfacher anpassbar zu machen, als den SELECT INTO direkt in die richtigen Tabellen zu schreiben. Die Leistung ist kein Problem, da rowcount relativ klein ist und nur bei Bedarf manuell ausgeführt wird.
... oder sag mir einfach, ob ich alles falsch mache.

345
Indrek

Versuchen Sie so etwas:

DECLARE @userData TABLE(
    name varchar(30) NOT NULL,
    oldlocation varchar(30) NOT NULL
);

INSERT INTO @userData (name, oldlocation)
SELECT name, location FROM myTable
INNER JOIN otherTable ON ...
WHERE age > 30;
554
CristiC

Der Zweck von SELECT INTO ist (laut den Dokumenten, meine Betonung)

To create eine neue Tabelle aus Werten in einer anderen Tabelle

Aber Sie haben bereits eine Zieltabelle ! Also, was Sie wollen, ist

Die INSERT -Anweisung fügt einer Tabelle eine oder mehrere neue Zeilen hinzu

Sie können die Datenwerte auf folgende Arten angeben:

...

Verwenden Sie eine SELECT -Unterabfrage, um die Datenwerte für eine oder mehrere Zeilen anzugeben, z.

  INSERT INTO MyTable 
 (PriKey, Description)
        SELECT ForeignKey, Description
        FROM SomeView

Und in dieser Syntax darf MyTable eine Tabellenvariable sein.

90
AakashM

Sie können auch allgemeine Tabellenausdrücke verwenden, um temporäre Datasets zu speichern. Sie sind eleganter und ad-hoc-freundlich:

WITH userData (name, oldlocation)
AS
(
  SELECT name, location 
  FROM   myTable    INNER JOIN 
         otherTable ON ...
  WHERE  age>30
)
SELECT * 
FROM   userData -- you can also reuse the recordset in subqueries and joins
25
nanestev

Sie können versuchen, temporäre Tabellen zu verwenden, wenn Sie dies nicht aus einer Anwendung heraus tun. (Es kann in Ordnung sein, dies manuell auszuführen.)

SELECT name, location INTO #userData FROM myTable
INNER JOIN otherTable ON ...
WHERE age>30

Sie überspringen den Aufwand, die Tabelle auf diese Weise zu deklarieren ... Hilft bei Ad-hoc-Abfragen ... Dadurch wird eine lokale temporäre Tabelle erstellt, die für andere Sitzungen nur sichtbar ist, wenn Sie sich in derselben Sitzung befinden. Möglicherweise ein Problem, wenn Sie eine Abfrage über eine App ausführen.

wenn Sie es für die Ausführung in einer App benötigen, verwenden Sie Variablen, die folgendermaßen deklariert wurden:

DECLARE @userData TABLE(
    name varchar(30) NOT NULL,
    oldlocation varchar(30) NOT NULL
);

INSERT INTO @userData
SELECT name, location FROM myTable
INNER JOIN otherTable ON ...
WHERE age > 30;

Bearbeiten: Wie viele von Ihnen bereits erwähnt haben, wurde die Sichtbarkeit der Sitzung von der Verbindung aus aktualisiert. Das Erstellen von temporären Tabellen ist für Webanwendungen keine Option, da Sitzungen wiederverwendet werden können. Halten Sie sich in diesen Fällen an temporäre Variablen

15
Mulki

Versuchen Sie, INSERT anstelle von SELECT INTO zu verwenden:

INSERT @UserData   
SELECT name, location etc.
8
Noel Abrahams

Erstellen Sie zuerst eine temporäre Tabelle:

Schritt 1:

create table #tblOm_Temp (

    Name varchar(100),
    Age Int ,
    RollNumber bigint
)

** Schritt 2: ** Geben Sie einen Wert in die Temp-Tabelle ein.

insert into #tblom_temp values('Om Pandey',102,1347)

Schritt 3: Deklarieren Sie eine Tabellenvariable für temporäre Tabellendaten.

declare   @tblOm_Variable table(

    Name Varchar(100),
    Age int,
    RollNumber bigint
)

Schritt 4: Wert aus der temporären Tabelle auswählen und in die Tabellenvariable einfügen.

insert into @tblOm_Variable select * from #tblom_temp

Schließlich wird ein Wert aus einer temporären Tabelle in eine Tabellenvariable eingefügt

Schritt 5: Kann eingefügten Wert in Tabellenvariable prüfen.

select * from @tblOm_Variable
5
404 Not found

OK, jetzt kann ich mit genügend Aufwand in @table Folgendes einfügen:

INSERT @TempWithheldTable SELECT
a.SuspendedReason, a.SuspendedNotes, a.SuspendedBy, a.ReasonCode FROM OPENROWSET (BULK 'C:\DataBases\WithHeld.csv', FORMATFILE = N'C:\DataBases\Format.txt ',
ERRORFILE = N'C:\Temp\MovieLensRatings.txt ') AS a;

Die Hauptsache hier ist die Auswahl der einzufügenden Spalten.

1
RahulJha