In manchen Fällen kann es bei SQL Server vorkommen, dass Sie die resultierenden Daten aus einer gespeicherten Prozedur übernehmen und in eine temporäre Tabelle einfügen möchten, um sie in einer anderen Abfrage zu verwenden. Es kann etwas schwierig sein, festzustellen, wie diese Aufgabe ausgeführt werden kann, daher skizzieren wir kurz einige Optionen, abhängig von Ihren spezifischen Anforderungen und der Datenbankkonfiguration.
Bevor wir die spezifischen Methoden untersuchen, erstellen wir eine Beispielprozedur. Obwohl es nicht besonders nützlich ist, erstellen wir BooksByPrimaryAuthor
Prozedur, die den @PrimaryAuthor
akzeptiert Parameter und holt Aufzeichnungen aus unseren books
Tabelle, in der @PrimaryAuthor
Streichhölzer. Die Anweisung zur Prozedurgenerierung könnte wie folgt aussehen:
CREATE PROC BooksByPrimaryAuthor
@PrimaryAuthor nvarchar(100)
AS
BEGIN
SELECT
*
FROM
books
WHERE
primary_author = @PrimaryAuthor;
END
GO
Im Idealfall möchten wir so etwas tun, wo wir SELECT
die resultierenden Daten aus unserem Verfahren und fügen Sie sie in eine temporäre Tabelle ein:
SELECT
*
INTO
#tmpSortedBooks
FROM
EXEC BooksByPrimaryAuthor 'Tolkien'
Das Problem ist, dass die obige Syntax falsch ist und nicht funktioniert . Wir brauchen eine neue Methode.
Verwendung der OPENROWSET-Anweisung
Eine Möglichkeit ist die Verwendung des OPENROWSET
-Anweisung, die Ihnen den Zugriff auf entfernte Daten aus einer OLE DB-Quelle ermöglicht und ausgeführt werden kann direkt aus einer anderen SQL-Anweisung heraus. OPENROWSET
ist eine einmalige Verbindungs- und Datenabrufmethode, daher sollte sie nicht für häufige Verbindungen verwendet werden (in diesem Fall ist das Verknüpfen von Servern vorzuziehen).
OPENROWSET
kann das Ziel von INSERT
sein , DELETE
, oder UPDATE
-Anweisung, was es ideal für unsere Zwecke macht, unsere gespeicherte Prozedur für uns „auszuführen“ und diese Daten wieder in unsere wartende temporäre Tabelle zu extrahieren.
Vor der Verwendung von OPENROWSET
, kann es erforderlich sein, einige Konfigurationsoptionen zu ändern, insbesondere durch das Zulassen des Ad-hoc-Zugriffs. Dies kann mit den folgenden Anweisungen konfiguriert werden:
sp_configure 'Show Advanced Options', 1
GO
RECONFIGURE
GO
sp_configure 'Ad Hoc Distributed Queries', 1
GO
RECONFIGURE
GO
Jetzt können wir OPENROWSET
verwenden , die eine bestimmte Syntax hat, die eingehalten werden muss:
OPENROWSET(
<PROVIDER_NAME>,
<DATA_SOURCE>,
<OPTIONS>
)
Daher können wir unsere gespeicherte Prozedur durch OPENROWSET
ausführen und übergeben Sie es wie folgt an unsere temporäre Tabelle:
SELECT
*
INTO
#tmpSortedBooks
FROM
OPENROWSET(
'SQLNCLI',
'Server=(local)\SQL2008;Trusted_Connection=yes;',
'EXEC BooksByPrimaryAuthor Tolkien'
)
Möglicherweise müssen Sie den PROVIDER_NAME
ändern und DATA_SOURCE
Werte für Ihre eigenen Zwecke.
Eine benutzerdefinierte Funktion verwenden
OPENROWSET
hat einige Nachteile -Methode, nämlich dass sie Ad-hoc-Berechtigungen/Konfiguration erfordert, wie wir oben gesehen haben, und auch OPENROWSET
kann nur ein einzelnes Resultset zurückgeben (wenn mehrere Sets bereitgestellt werden, wird nur das erste Resultset zurückgegeben).
Daher besteht eine andere Methode zur Durchführung dieser Aufgabe darin, die gespeicherte Prozedur stattdessen effektiv durch eine benutzerdefinierte Funktion zu ersetzen.
In unserem Beispiel würde das etwa so aussehen:
CREATE FUNCTION BooksByPrimaryAuthor
(
@PrimaryAuthor nvarchar(100)
)
RETURNS TABLE
AS
RETURN
SELECT
*
FROM
books
WHERE
primary_author = @PrimaryAuthor;
GO
Diese Funktion kann dann mit OPENROWSET
ungefähr in der gleichen Weise wie oben gewünscht verwendet werden :
SELECT
*
INTO
#tmpSortedBooks
FROM
BooksByPrimaryAuthor('Tolkien')
Falls Sie wirklich eine gespeicherte Prozedur benötigen, können Sie Ihre Funktion auch in eine gespeicherte Prozedur einschließen.