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.