Benutzer mit den meisten Antworten
Rückgabe aus SP mit Select einschränken und in temporäre Tabelle einfügen

Frage
-
Hallo,
ich möchte das Ergebnis aus einer Stored Procedure in eine temporärte Tabelle einfügen, das würde ja gehen mit:
insert into #temptable (col1, col2, col3)
exec usp_blablaAllerdings gibt mir die SP knapp 15 Spalten zurück, ich brauche aber nur drei Spalten vom Ergebnis. Die SP wurde nicht für meinen Zweck geschrieben, liefert mir aber die Daten und könnte mal angepasst warden, daher möchte ich diese SP verwenden.
Ich denke man kann nicht automatisch ohne create eine temporäre Tabelle aus dem Ergebnis der SP erstellen? Daher würde ich gerne die drei benötigten Spalten aus dem Ergebnis abfragen und verwenden.
Wie könnte das gehen?
Viele Grüsse,
Maximilian
Antworten
-
Eine Möglichkeit ist die Verwendung von OPENQUERY.
Nachfolgend ein kleines Beispiel:
use tempdb go -- Erstellen einer Beispielprozedur CREATE PROC YourProc AS SELECT 1 as col1, 2 as col2, '3' as col3 go -- Aktivieren Datenzugriff für den Zugriff über verteilte Abfragen -- SELECT name FROM sys.servers WHERE is_linked = 0 -- falls der Name der lokalen SQL-Instanz nicht bekannt ist EXEC sp_serveroption 'YourSqlInstanceName', 'DATA ACCESS', TRUE go -- Aufruf der Prozedur über OPENQUERY und speichern aller Spalten in einer temp. Tabelle #x1 SELECT * INTO #x1 FROM OPENQUERY([YourSqlInstanceName],'EXEC tempdb.dbo.YourProc') -- Aufruf der Prozedur über OPENQUERY und speichern einer ausgewählten Spalte in einer temp. Tabelle #x2 SELECT col1 INTO #x2 FROM OPENQUERY([YourSqlInstanceName],'EXEC tempdb.dbo.YourProc') -- Anzeige der Ergebnisse SELECT * FROM #x1 SELECT * FROM #x2 -- cleanup DROP PROC dbo.YourProc DROP TABLE #x1 DROP TABLE #x2
Edit: so lange die aufgerufene Prozedur zumindest die ausgewählten Spalten zurück gibt, gibt OPENQUERY keine Fehler zurück.
-
Hallo Maximilian,
INSERT EXEC lässt sich nicht konfigurieren - siehe Dokumentation (Abschnitt execute_statement). Es gibt zwar eine Lösung via OPENROWSET - siehe z. B. Methode 2 - aber IMHO ist das den Teufel mit dem Beelzebub austreiben - ändert sich die Prozedur oder die Konfiguration knallt es trotzdem.
Am vernünftigsten ist es insofern, die zu vielen Spalten hinzunehmen und sich am Ende die drei gewünschten danach heraus zu picken.
Gruß Elmar
- Als Antwort markiert MaxiTesch Dienstag, 10. März 2015 17:03
Alle Antworten
-
Hallo Maximilian,
INSERT EXEC lässt sich nicht konfigurieren - siehe Dokumentation (Abschnitt execute_statement). Es gibt zwar eine Lösung via OPENROWSET - siehe z. B. Methode 2 - aber IMHO ist das den Teufel mit dem Beelzebub austreiben - ändert sich die Prozedur oder die Konfiguration knallt es trotzdem.
Am vernünftigsten ist es insofern, die zu vielen Spalten hinzunehmen und sich am Ende die drei gewünschten danach heraus zu picken.
Gruß Elmar
- Als Antwort markiert MaxiTesch Dienstag, 10. März 2015 17:03
-
Eine Möglichkeit ist die Verwendung von OPENQUERY.
Nachfolgend ein kleines Beispiel:
use tempdb go -- Erstellen einer Beispielprozedur CREATE PROC YourProc AS SELECT 1 as col1, 2 as col2, '3' as col3 go -- Aktivieren Datenzugriff für den Zugriff über verteilte Abfragen -- SELECT name FROM sys.servers WHERE is_linked = 0 -- falls der Name der lokalen SQL-Instanz nicht bekannt ist EXEC sp_serveroption 'YourSqlInstanceName', 'DATA ACCESS', TRUE go -- Aufruf der Prozedur über OPENQUERY und speichern aller Spalten in einer temp. Tabelle #x1 SELECT * INTO #x1 FROM OPENQUERY([YourSqlInstanceName],'EXEC tempdb.dbo.YourProc') -- Aufruf der Prozedur über OPENQUERY und speichern einer ausgewählten Spalte in einer temp. Tabelle #x2 SELECT col1 INTO #x2 FROM OPENQUERY([YourSqlInstanceName],'EXEC tempdb.dbo.YourProc') -- Anzeige der Ergebnisse SELECT * FROM #x1 SELECT * FROM #x2 -- cleanup DROP PROC dbo.YourProc DROP TABLE #x1 DROP TABLE #x2
Edit: so lange die aufgerufene Prozedur zumindest die ausgewählten Spalten zurück gibt, gibt OPENQUERY keine Fehler zurück.