Frage Fügen Sie Ergebnisse einer gespeicherten Prozedur in eine temporäre Tabelle ein


Wie mache ich ein SELECT * INTO [temp table] FROM [stored procedure]? Nicht FROM [Table] und ohne zu definieren [temp table]?

Select alle Daten von BusinessLine in tmpBusLine funktioniert gut.

select *
into tmpBusLine
from BusinessLine

Ich versuche das gleiche, aber mit a stored procedure das Daten zurückgibt, ist nicht ganz dasselbe.

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

Ausgabenachricht:

Msg 156, Ebene 15, Staat 1, Linie 2   Falsche Syntax in der Nähe des Schlüsselworts   "Exec".

Ich habe mehrere Beispiele zum Erstellen einer temporären Tabelle mit der gleichen Struktur wie die gespeicherte Ausgabeprozedur gelesen, die gut funktioniert, aber es wäre nett, keine Spalten zu liefern.


1336
2018-03-17 10:45


Ursprung


Antworten:


Sie können verwenden OPENROWSET dafür. Guck mal. Ich habe auch den sp_configure-Code hinzugefügt, um Ad-hoc-verteilte Abfragen zu aktivieren, falls dies nicht bereits 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

619
2017-08-04 15:27



Wenn Sie dies tun möchten, ohne zuerst die temporäre Tabelle zu deklarieren, können Sie versuchen, eine benutzerdefinierte Funktion anstelle von a zu erstellen gespeicherte Prozedur und veranlassen, dass diese benutzerdefinierte Funktion eine Tabelle zurückgibt. Wenn Sie die gespeicherte Prozedur verwenden möchten, versuchen Sie alternativ Folgendes:

CREATE TABLE #tmpBus
(
   COL1 INT,
   COL2 INT
)

INSERT INTO #tmpBus
Exec SpGetRecords 'Params'

517
2018-03-17 14:08



In SQL Server 2005 können Sie verwenden INSERT INTO ... EXEC Einfügen des Ergebnisses einer gespeicherten Prozedur in eine Tabelle Von MSDNs INSERT Dokumentation (für SQL Server 2000 tatsächlich):

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

267
2018-03-17 10:50



Dies ist eine Antwort auf eine leicht modifizierte Version Ihrer Frage. Wenn Sie die Verwendung einer gespeicherten Prozedur für eine benutzerdefinierte Funktion beenden können, können Sie eine benutzerdefinierte benutzerdefinierte Inline-Tabellenfunktion verwenden. Dies ist im Wesentlichen eine gespeicherte Prozedur (übernimmt Parameter), die eine Tabelle als Ergebnismenge zurückgibt; und wird daher gut mit einer INTO-Anweisung platziert.

Hier ist ein gutes schneller Artikel darauf und andere benutzerdefinierte Funktionen. Wenn Sie weiterhin eine gespeicherte Prozedur benötigen, können Sie die benutzerdefinierte Inline-Tabellenfunktion mit einer gespeicherten Prozedur umbrechen. Die gespeicherte Prozedur übergibt Parameter nur, wenn sie SELECT * aus der benutzerdefinierten benutzerdefinierten Inline-Tabellenfunktion aufruft.

So haben Sie zum Beispiel eine benutzerdefinierte benutzerdefinierte Inline-Tabellenfunktion, 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 diese Funktion dann aufrufen, um zu erhalten, was Ihre Ergebnisse sind:

SELECT * FROM CustomersbyRegion(1)

Oder um eine SELECT INTO zu machen:

SELECT * INTO CustList FROM CustomersbyRegion(1)

Wenn Sie noch eine gespeicherte Prozedur benötigen, dann wickeln Sie die Funktion wie folgt um:

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

Ich denke, das ist die "hackless" Methode, um die gewünschten Ergebnisse zu erzielen. Es verwendet die vorhandenen Funktionen, da sie ohne zusätzliche Komplikationen verwendet werden sollten. Durch Verschachteln der Inline-Tabellenwert-benutzerdefinierten Funktion in der gespeicherten Prozedur haben Sie auf zwei Arten Zugriff auf die Funktionalität. Plus! Sie haben nur einen Wartungspunkt für den tatsächlichen SQL-Code.

Die Verwendung von OPENROWSET wurde vorgeschlagen, aber die OPENROWSET-Funktion sollte nicht dafür verwendet werden (aus der Onlinedokumentation):

Enthält alle Verbindungsinformationen   Dies ist erforderlich, um auf entfernte Daten zuzugreifen   aus einer OLE DB-Datenquelle. Dies   Methode ist eine Alternative zum Zugriff   Tabellen in einem verbundenen Server und ist ein   einmalige Ad-hoc-Verbindungsmethode   und Zugreifen auf Remote-Daten mithilfe von OLE   DB. Für häufigere Verweise auf   OLE DB-Datenquellen, Verwendung verknüpft   Server stattdessen.

Wenn Sie OPENROWSET verwenden, wird die Aufgabe erledigt, es wird jedoch zusätzlicher Aufwand für das Öffnen lokaler Verbindungen und das Marshalling von Daten verursacht. Es ist möglicherweise auch nicht in allen Fällen eine Option, da es eine Ad-hoc-Abfrageerlaubnis erfordert, die ein Sicherheitsrisiko darstellt und daher möglicherweise nicht erwünscht ist. Der OPENROWSET-Ansatz schließt außerdem die Verwendung gespeicherter Prozeduren aus, die mehr als eine Ergebnismenge zurückgeben. Das Umschließen mehrerer benutzerdefinierter Inline-Tabellenwertfunktionen in einer einzigen gespeicherten Prozedur kann dies erreichen.


166
2017-08-04 17:11



SELECT  *
INTO    #tmpTable
FROM    OPENQUERY(YOURSERVERNAME, 'EXEC test.dbo.prc_test 1')

100
2018-03-17 10:50



Einfachste Lösung:

CREATE TABLE #temp (...);

INSERT INTO #temp
EXEC [sproc];

Wenn Sie das Schema nicht kennen, können Sie Folgendes tun. Bitte Beachten Sie, dass bei dieser Methode schwerwiegende Sicherheitsrisiken bestehen.

SELECT * 
INTO #temp
FROM OPENROWSET('SQLNCLI', 
                'Server=localhost;Trusted_Connection=yes;', 
                'EXEC [db].[schema].[sproc]')

90
2018-03-13 19:38



Wenn die gespeicherte Prozedur viele Spalten zurückgibt und Sie nicht möchten, dass eine temporäre Tabelle manuell erstellt wird, um das Ergebnis zu speichern, habe ich herausgefunden, dass der einfachste Weg darin besteht, in die gespeicherte Prozedur zu gehen und eine "in" -Klausel hinzuzufügen Letzte SELECT-Anweisung und fügen Sie der WHERE-Klausel 1 = 0 hinzu.

Führen Sie die gespeicherte Prozedur einmal aus und gehen Sie zurück und entfernen Sie den gerade hinzugefügten SQL-Code. Jetzt haben Sie eine leere Tabelle, die mit dem Ergebnis der gespeicherten Prozedur übereinstimmt. Sie könnten entweder "Tabelle als Erstelle" für eine temporäre Tabelle erstellen oder einfach direkt in diese Tabelle einfügen.


80
2018-03-17 14:06