I nogle tilfælde med SQL Server kan der være et tilfælde, hvor du ønsker at tage de resulterende data fra en lagret procedure og indsætte dem i en midlertidig tabel til brug i en anden forespørgsel. Det kan være lidt svært at bestemme, hvordan denne opgave skal udføres, så vi vil kort skitsere et par muligheder, afhængigt af dine specifikke behov og databasekonfiguration.
Før vi undersøger de specifikke metoder, lad os lave en eksempelprocedure. Selvom det ikke er særlig nyttigt, lad os oprette BooksByPrimaryAuthor
procedure, som accepterer @PrimaryAuthor
parameter og henter poster fra vores books
tabel, hvor den @PrimaryAuthor
Tændstikker. Proceduregenereringserklæringen kan se sådan ud:
CREATE PROC BooksByPrimaryAuthor
@PrimaryAuthor nvarchar(100)
AS
BEGIN
SELECT
*
FROM
books
WHERE
primary_author = @PrimaryAuthor;
END
GO
Ideelt set er det, vi gerne vil gøre, noget som dette, hvor vi SELECT
de resulterende data fra vores procedure og indsæt dem i en midlertidig tabel:
SELECT
*
INTO
#tmpSortedBooks
FROM
EXEC BooksByPrimaryAuthor 'Tolkien'
Problemet er ovenstående syntaks er forkert og vil ikke fungere . Vi har brug for en ny metode.
Brug af OPENROWSET-erklæringen
En mulighed er at bruge OPENROWSET
sætning, som giver dig adgang til fjerndata fra en OLE DB-kilde og kan udføres direkte fra en anden SQL-sætning. OPENROWSET
er en engangsforbindelse og datahentningsmetode, så den bør ikke bruges til hyppige forbindelser (tilknytning af servere er at foretrække i så fald).
OPENROWSET
kan være målet for enhver INSERT
, DELETE
eller UPDATE
erklæring, hvilket gør den ideel til vores formål at "udføre" vores lagrede procedure for os og udtrække disse data tilbage til vores ventende midlertidige bord.
Før du bruger OPENROWSET
, kan det være nødvendigt at ændre nogle konfigurationsmuligheder, specifikt ved at tillade ad hoc-adgang. Dette kan konfigureres ved hjælp af følgende udsagn:
sp_configure 'Show Advanced Options', 1
GO
RECONFIGURE
GO
sp_configure 'Ad Hoc Distributed Queries', 1
GO
RECONFIGURE
GO
Nu kan vi bruge OPENROWSET
, som har en bestemt syntaks, der skal overholdes:
OPENROWSET(
<PROVIDER_NAME>,
<DATA_SOURCE>,
<OPTIONS>
)
Derfor kan vi udføre vores lagrede procedure gennem OPENROWSET
og send det til vores midlertidige bord sådan:
SELECT
*
INTO
#tmpSortedBooks
FROM
OPENROWSET(
'SQLNCLI',
'Server=(local)\SQL2008;Trusted_Connection=yes;',
'EXEC BooksByPrimaryAuthor Tolkien'
)
Du skal muligvis ændre PROVIDER_NAME
og DATA_SOURCE
værdier til dine egne formål.
Brug af en brugerdefineret funktion
Der er et par ulemper ved OPENROWSET
metode, nemlig at den kræver ad hoc tilladelser/konfiguration som vi så ovenfor, og også OPENROWSET
er kun i stand til at returnere et enkelt resultatsæt (hvis der er angivet flere sæt, returneres kun det første resultatsæt).
Derfor er en anden metode til at udføre denne opgave effektivt at erstatte den lagrede procedure med en brugerdefineret funktion i stedet for.
Fra vores eksempel ville det se sådan ud:
CREATE FUNCTION BooksByPrimaryAuthor
(
@PrimaryAuthor nvarchar(100)
)
RETURNS TABLE
AS
RETURN
SELECT
*
FROM
books
WHERE
primary_author = @PrimaryAuthor;
GO
Denne funktion kan så bruges nogenlunde på samme måde som ønsket ovenfor ved hjælp af OPENROWSET
:
SELECT
*
INTO
#tmpSortedBooks
FROM
BooksByPrimaryAuthor('Tolkien')
I tilfælde af at du virkelig har brug for en lagret procedure, kan du også pakke din funktion ind i en lagret procedure.