2016-11-21 9 views
2

Ich habe SQL-Filterung, die Abfrage mit unsicheren Anzahl der Spalten zurückgibt, und Ergebnisse in gespeicherten Prozedur verwenden möchten.Wie lokale temporäre Tabelle von generierten sql zurückgegeben werden

DECLARE @RecordSelectionSql VARCHAR(MAX) 
SET @RecordSelectionSql = (SELECT SQLQUERY FROM RecordSelection WHERE Id = @Id) + ' AND ([Active] = 1)' 

DECLARE @sql NVARCHAR(MAX) = N''; 
SELECT @sql += ',' + CHAR(13) + CHAR(10) + CHAR(9) + name + ' ' + system_type_name 
FROM sys.dm_exec_describe_first_result_set(@RecordSelectionSql, NULL, 0); 

SELECT @sql = N'CREATE TABLE #TmpImport 
(' + STUFF(@sql, 1, 1, N'') + ' 
);'; 
EXEC (@sql) 

INSERT INTO #TmpImport 
EXEC (@RecordSelectionSql) 

aber ich bin immer Fehler

Invalid object name '#TmpImport'. 

Wie man richtig um diesen Teil codieren?

EDIT: hinzugefügt fehlende Bedingung auf RecordSelection

EDIT2: Ich kann nicht unten verwenden, um Code, weil #TmpImport nach zerstört @RecordSelectionSql ausgeführt wird.

gibt die gleichen Fehler

Invalid object name '#TmpImport'. 

Antwort

1

Es ist viel einfacher in die temporäre Tabelle zu wählen.

Zum Beispiel

SELECT * INTO #TmpImport FROM SomeTable 
+0

Bitte lesen Sie meine Frage – amuliar

+0

Ich habe Ihre Frage gelesen, dann antwortete ich es .. –

+0

Ich habe nicht Sometable aber ich habe dynamische SQL in Variable @RecordSelectionSql – amuliar

5

Temporäre Tabellen sind nur innerhalb der Sitzung zur Verfügung, die sie geschaffen haben. Mit Dynamic SQL bedeutet dies, dass es nicht verfügbar ist, nachdem Dynamic SQL ausgeführt wurde. Ihre Optionen hier sind:

  1. Erstellen Sie eine globale temporäre Tabelle, die außerhalb Ihrer Sitzung anhalten wird, bis sie explizit aus TempDB andere Weise fallen gelassen oder gelöscht, mit einem Doppel-Hash: create table ##GlobalTemp
    - einzuarbeiten Der folgende sehr relevante Kommentar von Radu: Da diese Tabelle außerhalb Ihrer Sitzung bestehen bleibt, müssen Sie sicherstellen, dass Sie nicht zwei davon erstellen oder zwei verschiedene Prozesse verwenden, die versuchen, Daten darin zu verarbeiten. Sie müssen die globale temporäre Tabelle, mit der Sie arbeiten möchten, eindeutig identifizieren können.
  2. Sie können eine normale Tabelle erstellen und daran denken, sie anschließend erneut zu löschen.
  3. einschließen, was Logik, wenn die temporäre Tabelle innerhalb des dynamischen SQL-Skript

Für Ihre bestimmte Instanz verweisen muss, Sie sind am besten aus einfach eine select into Ausführung, die Tabellenstruktur der Daten generieren, die ausgewählt wird .

+4

Das einzige Problem mit der globalen temporären Tabelle (GTT) ist, dass es aus anderen Sitzungen sichtbar ist, so dass Sie nicht in der Lage sind, eine GTT mit dem gleichen Namen aus einer anderen Sitzung zu erstellen.Sie müssen einen Mechanismus entwickeln, um eine GTT für jede Sitzung eindeutig zu identifizieren, wenn Sie den Bereinigungsteil vor dem Schließen der Sitzung ausführen müssen. –

+0

@RaduGheorghiu Sehr relevante zusätzliche Informationen, danke. Habe zu den oben genannten hinzugefügt. – iamdave

+0

ich zufällig id \t declare @ int \t SET @ db_id = CAST DB_ID erstellen (rund (RAND() * 2147483647, 0) AS INT) in sie wählen dynamische SQL-and-Drop als EXEC ‚DROP TABLE ## TmpImport '+ CAST (@ db_id AS NVARCHAR). Jedoch kann ich es später in SP nicht verwenden, ohne die gesamte gespeicherte Prozedurlogik in dynamic sql einzuschließen. – amuliar

Verwandte Themen