Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

So fügen Sie die Ergebnisse einer gespeicherten Prozedur in eine temporäre Tabelle in SQL Server ein

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.