none
Rückgabe aus SP mit Select einschränken und in temporäre Tabelle einfügen RRS feed

  • 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_blabla

    Allerdings 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

    Sonntag, 8. März 2015 15:29

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.


    • Bearbeitet LMU92 Sonntag, 8. März 2015 17:26
    • Als Antwort markiert MaxiTesch Dienstag, 10. März 2015 17:03
    Sonntag, 8. März 2015 17:10
  • 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
    Sonntag, 8. März 2015 17:06
    Beantworter

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
    Sonntag, 8. März 2015 17:06
    Beantworter
  • 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.


    • Bearbeitet LMU92 Sonntag, 8. März 2015 17:26
    • Als Antwort markiert MaxiTesch Dienstag, 10. März 2015 17:03
    Sonntag, 8. März 2015 17:10