1849 Stimmen

Ergebnisse einer gespeicherten Prozedur in eine temporäre Tabelle einfügen

Wie mache ich eine SELECT * INTO [temp table] FROM [stored procedure] ? Nicht FROM [Table] und ohne Definition von [temp table] ?

Select alle Daten von BusinessLine in tmpBusLine funktioniert gut.

select *
into tmpBusLine
from BusinessLine

Ich versuche das Gleiche, aber mit einem stored procedure die Daten zurückgibt, ist nicht ganz dasselbe.

select *
into tmpBusLine
from
exec getBusinessLineHistory '16 Mar 2009'

Meldung ausgeben:

Msg 156, Ebene 15, Zustand 1, Zeile 2 Falsche Syntax bei dem Schlüsselwort 'exec'.

Ich habe mehrere Beispiele für die Erstellung einer temporären Tabelle mit derselben Struktur wie die ausgegebene gespeicherte Prozedur gelesen, was gut funktioniert, aber es wäre schön, wenn man keine Spalten angeben müsste.

773voto

Aaron Alton Punkte 22030

Sie können verwenden OPENROWSET für diese. Werfen Sie einen Blick darauf. Ich habe auch den sp_configure-Code zur Aktivierung von Ad Hoc Distributed Queries eingefügt, falls er noch nicht aktiviert ist.

CREATE PROC getBusinessLineHistory
AS
BEGIN
    SELECT * FROM sys.databases
END
GO

sp_configure 'Show Advanced Options', 1
GO
RECONFIGURE
GO
sp_configure 'Ad Hoc Distributed Queries', 1
GO
RECONFIGURE
GO

SELECT * INTO #MyTempTable FROM OPENROWSET('SQLNCLI', 'Server=(local)\SQL2008;Trusted_Connection=yes;',
     'EXEC getBusinessLineHistory')

SELECT * FROM #MyTempTable

747voto

Gavin Punkte 16443

Wenn Sie dies tun wollen, ohne zuerst die temporäre Tabelle zu deklarieren, könnten Sie versuchen, eine benutzerdefinierte Funktion anstelle einer gespeicherte Prozedur und lassen Sie diese benutzerdefinierte Funktion eine Tabelle zurückgeben. Wenn Sie alternativ die gespeicherte Prozedur verwenden möchten, versuchen Sie etwas wie dies:

CREATE TABLE #tmpBus
(
   COL1 INT,
   COL2 INT
)

INSERT INTO #tmpBus
Exec SpGetRecords 'Params'

319voto

Matt Hamilton Punkte 193704

In SQL Server 2005 können Sie Folgendes verwenden INSERT INTO ... EXEC um das Ergebnis einer gespeicherten Prozedur in eine Tabelle einzufügen. Von MSDN's INSERT Dokumentation (für SQL Server 2000, in der Tat):

--INSERT...EXECUTE procedure example
INSERT author_sales EXECUTE get_author_sales

213voto

Christian Loris Punkte 4094

Dies ist eine Antwort auf eine leicht abgewandelte Version Ihrer Frage. Wenn Sie auf die Verwendung einer gespeicherten Prozedur für eine benutzerdefinierte Funktion verzichten können, können Sie eine benutzerdefinierte Funktion mit Inline-Tabellenwert verwenden. Dabei handelt es sich im Wesentlichen um eine gespeicherte Prozedur (mit Parametern), die eine Tabelle als Ergebnismenge zurückgibt und sich daher gut mit einer INTO-Anweisung kombinieren lässt.

Hier ist eine gute schneller Artikel und andere benutzerdefinierte Funktionen. Wenn Sie dennoch eine gespeicherte Prozedur benötigen, können Sie die benutzerdefinierte Inline-Tabellenfunktion mit einer gespeicherten Prozedur umhüllen. Die gespeicherte Prozedur übergibt nur Parameter, wenn sie select * von der benutzerdefinierten Funktion mit Tabellenwert aufruft.

So könnten Sie zum Beispiel eine benutzerdefinierte Funktion mit Tabellenwerten einbinden, um eine Liste von Kunden für eine bestimmte Region zu erhalten:

CREATE FUNCTION CustomersByRegion 
(  
    @RegionID int  
)
RETURNS TABLE 
AS
RETURN 
  SELECT *
  FROM customers
  WHERE RegionID = @RegionID
GO

Sie können dann diese Funktion aufrufen, um Ihre Ergebnisse zu erhalten:

SELECT * FROM CustomersbyRegion(1)

Oder um ein SELECT INTO auszuführen:

SELECT * INTO CustList FROM CustomersbyRegion(1)

Wenn Sie dennoch eine gespeicherte Prozedur benötigen, dann verpacken Sie die Funktion als solche:

CREATE PROCEDURE uspCustomersByRegion 
(  
    @regionID int  
)
AS
BEGIN
     SELECT * FROM CustomersbyRegion(@regionID);
END
GO

Meiner Meinung nach ist dies die "hack-loseste" Methode, um die gewünschten Ergebnisse zu erzielen. Sie verwendet die vorhandenen Funktionen so, wie sie ohne zusätzliche Komplikationen verwendet werden sollen. Durch die Verschachtelung der benutzerdefinierten Inline-Tabellenfunktion in der gespeicherten Prozedur haben Sie auf zwei Arten Zugriff auf die Funktionalität. Plus! Sie haben nur einen Wartungspunkt für den eigentlichen SQL-Code.

Die Verwendung von OPENROWSET wurde vorgeschlagen, aber dafür ist die Funktion OPENROWSET nicht gedacht (From Books Online):

Enthält alle Verbindungsinformationen die erforderlich sind, um auf entfernte Daten von einer OLE DB-Datenquelle zuzugreifen. Diese Methode ist eine Alternative zum Zugriff auf Tabellen in einem verknüpften Server und ist eine einmalige Ad-hoc-Methode zur Verbindung und Zugriff auf entfernte Daten mit Hilfe von OLE DB. Für häufigere Verweise auf OLE DB-Datenquellen, verwenden Sie stattdessen verknüpfte Server stattdessen.

Die Verwendung von OPENROWSET erledigt die Aufgabe, verursacht aber zusätzlichen Overhead für das Öffnen lokaler Verbindungen und das Marshalling von Daten. Sie ist auch nicht in allen Fällen eine Option, da sie eine Ad-hoc-Abfrageerlaubnis erfordert, die ein Sicherheitsrisiko darstellt und daher möglicherweise nicht erwünscht ist. Außerdem schließt der OPENROWSET-Ansatz die Verwendung von gespeicherten Prozeduren aus, die mehr als eine Ergebnismenge zurückgeben. Dies kann erreicht werden, indem mehrere benutzerdefinierte Inline-Tabellenwert-Funktionen in eine einzige Stored Procedure eingeschlossen werden.

151voto

Quassnoi Punkte 396418
Select @@ServerName
EXEC sp_serveroption @@ServerName, 'DATA ACCESS', TRUE

SELECT  *
INTO    #tmpTable
FROM    OPENQUERY(YOURSERVERNAME, 'EXEC db.schema.sproc 1')

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X