Ich habe eine komplexe SELECT-Abfrage erhalten, aus der ich alle Zeilen in eine Tabellenvariable einfügen möchte, aber T-SQL lässt dies nicht zu.
In diesem Sinne können Sie keine Tabellenvariable 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 Kopie derselben Daten mit geringfügigen Aktualisierungen). Das Ziel wäre es, das Skript einfach ein bisschen lesbarer und leichter anpassbar zu machen, als es SELECT INTO
direkt in die richtigen Tabellen zu bringen. Die Leistung ist kein Problem, da sie rowcount
relativ klein ist und nur bei Bedarf manuell ausgeführt wird.
... oder sag mir einfach, ob ich alles falsch mache.
quelle
Der Zweck von
SELECT INTO
ist (gemäß den Dokumenten, meine Betonung)Aber Sie bereits haben eine Zieltabelle! Also was du willst ist
In dieser Syntax darf
MyTable
es sich um eine Tabellenvariable handeln.quelle
MyTable
hier ist ein Platzhalter für den Namen Ihrer tatsächlichen Tabelle . Ich glaube nicht, dass es echte Datenbanken mit einer Tabelle namensMyTable
...Sie können auch allgemeine Tabellenausdrücke verwenden, um temporäre Datasets zu speichern. Sie sind eleganter und adhoc-freundlicher:
quelle
Sie können versuchen, temporäre Tabellen zu verwenden, wenn Sie dies nicht über eine Anwendung tun. (Es kann in Ordnung sein, dies manuell auszuführen)
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 die folgenden Variablen:
Bearbeiten: Wie viele von Ihnen erwähnt haben, wurde die Sichtbarkeit der Sitzung von der Verbindung aus aktualisiert. Das Erstellen von temporären Tabellen ist keine Option für Webanwendungen, da Sitzungen wiederverwendet werden können. Halten Sie sich in diesen Fällen an temporäre Variablen
quelle
function
. Nach meiner Erfahrung bedeutet dies in den meisten Fällen, in denen jemand glaubt, solche Aussagen zu benötigen, tatsächlich, dass er seinefunction
- oder zumindest die Umgestaltung auf a - überdenken sollteprocedure
. Zumindest für mich selbst sprechen. :-)Versuchen Sie
INSERT
anstelle vonSELECT INTO
:quelle
Erstellen Sie zuerst eine temporäre Tabelle:
Schritt 1:
** Schritt 2: ** Fügen Sie einen Wert in die Temp-Tabelle ein.
Schritt 3: Deklarieren Sie eine Tabellenvariable, um temporäre Tabellendaten zu speichern.
Schritt 4: Wählen Sie einen Wert aus der temporären Tabelle aus und fügen Sie ihn in die Tabellenvariable ein.
Schließlich wird der Wert aus einer temporären Tabelle in die Tabellenvariable eingefügt
Schritt 5: Kann den eingefügten Wert in der Tabellenvariablen überprüfen.
quelle
OK, jetzt kann ich mit genügend Aufwand Folgendes in @table einfügen:
Die Hauptsache hier ist die Auswahl der einzufügenden Spalten.
quelle
Ein Grund für die Verwendung von SELECT INTO besteht darin, dass Sie IDENTITY verwenden können:
Dies würde mit einer Tabellenvariablen nicht funktionieren, was zu schade ist ...
quelle
IDENTITY
Spalte deklarieren .