sql >> Database >  >> RDS >> Sqlserver

De resultaten van een opgeslagen procedure invoegen in een tijdelijke tabel in SQL Server

In sommige gevallen met SQL Server kan het voorkomen dat u de resulterende gegevens uit een opgeslagen procedure wilt halen en deze in een tijdelijke tabel wilt invoegen voor gebruik in een andere query. Bepalen hoe u deze taak kunt uitvoeren, kan enigszins moeilijk zijn, dus we zullen kort een paar opties schetsen, afhankelijk van uw specifieke behoeften en databaseconfiguratie.

Voordat we de specifieke methoden onderzoeken, maken we eerst een voorbeeldprocedure. Hoewel dit niet erg handig is, maken we de BooksByPrimaryAuthor procedure, die de @PrimaryAuthor . accepteert parameter en haalt records uit onze books tabel waarin dat @PrimaryAuthor wedstrijden. De instructie voor het genereren van de procedure kan er als volgt uitzien:

CREATE PROC BooksByPrimaryAuthor
  @PrimaryAuthor nvarchar(100)
AS
BEGIN
  SELECT
    *
  FROM
    books
  WHERE
    primary_author = @PrimaryAuthor;
END
GO

In het ideale geval zouden we zoiets willen doen, waarbij we SELECT de resulterende gegevens van onze procedure en plaats deze in een tijdelijke tabel:

SELECT
  *
INTO
  #tmpSortedBooks
FROM
  EXEC BooksByPrimaryAuthor 'Tolkien'

Het probleem is de bovenstaande syntaxis is onjuist en zal niet werken . We hebben een nieuwe methode nodig.

Het OPENROWSET-statement gebruiken

Een mogelijkheid is om de OPENROWSET . te gebruiken statement, waarmee u toegang hebt tot externe gegevens van een OLE DB-bron en die uitgevoerd kan worden rechtstreeks vanuit een andere SQL-instructie. OPENROWSET is een eenmalige methode om verbinding te maken en gegevens op te halen, dus het mag niet worden gebruikt voor frequente verbindingen (het koppelen van servers heeft in dat geval de voorkeur).

OPENROWSET kan het doelwit zijn van elke INSERT , DELETE , of UPDATE verklaring, wat het ideaal maakt voor onze doeleinden om onze opgeslagen procedure voor ons uit te voeren en die gegevens terug te extraheren naar onze wachtende tijdelijke tabel.

Voordat u OPENROWSET gebruikt , kan het nodig zijn om enkele configuratie-opties te wijzigen, met name door ad-hoctoegang toe te staan. Dit kan worden geconfigureerd met behulp van de volgende instructies:

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

Nu kunnen we OPENROWSET gebruiken , die een bepaalde syntaxis heeft waaraan moet worden voldaan:

OPENROWSET(
  <PROVIDER_NAME>,
  <DATA_SOURCE>,
  <OPTIONS>
)

We kunnen dus onze opgeslagen procedure uitvoeren via OPENROWSET en geef het als volgt door aan onze tijdelijke tafel:

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

Mogelijk moet u de PROVIDER_NAME . wijzigen en DATA_SOURCE waarden voor uw eigen doeleinden.

Een door de gebruiker gedefinieerde functie gebruiken

Er zijn een paar nadelen aan de OPENROWSET methode, namelijk dat het ad hoc permissies/configuratie vereist zoals we hierboven zagen, en ook OPENROWSET kan alleen een enkele resultaatset retourneren (als er meerdere sets zijn, wordt alleen de eerste resultaatset geretourneerd).

Daarom is een andere methode om deze taak uit te voeren, in plaats daarvan de opgeslagen procedure effectief te vervangen door een door de gebruiker gedefinieerde functie.

Vanuit ons voorbeeld zou dat er ongeveer zo uitzien:

CREATE FUNCTION BooksByPrimaryAuthor
(
  @PrimaryAuthor nvarchar(100)
)
RETURNS TABLE
AS
RETURN
  SELECT
    *
  FROM
    books
  WHERE
    primary_author = @PrimaryAuthor;
GO

Deze functie kan dan ongeveer op dezelfde manier worden gebruikt als hierboven gewenst met behulp van OPENROWSET :

SELECT
  *
INTO
  #tmpSortedBooks
FROM
  BooksByPrimaryAuthor('Tolkien')

In het geval dat u echt een opgeslagen procedure nodig heeft, kunt u uw functie ook in een opgeslagen procedure opnemen.


  1. Hoe een id uit de database te halen bij het klikken op een lijstweergave-item in Android

  2. INSERT INTO vs SELECT INTO

  3. Hoe dwing ik Postgres om een ​​bepaalde index te gebruiken?

  4. ProxySQL uitvoeren als Kubernetes-service