I vissa fall med SQL Server kan det finnas ett fall där du vill ta den resulterande informationen från en lagrad procedur och infoga den i en temporär tabell för användning i en annan fråga. Det kan vara lite svårt att avgöra hur man ska utföra denna uppgift, så vi ska kortfattat beskriva ett par alternativ, beroende på dina specifika behov och databaskonfiguration.
Innan vi undersöker de specifika metoderna, låt oss skapa en exempelprocedur. Även om det inte är särskilt användbart, låt oss skapa BooksByPrimaryAuthor
proceduren, som accepterar @PrimaryAuthor
parameter och hämtar poster från våra books
tabell där @PrimaryAuthor
tändstickor. Procedurgenereringssatsen kan se ut så här:
CREATE PROC BooksByPrimaryAuthor
@PrimaryAuthor nvarchar(100)
AS
BEGIN
SELECT
*
FROM
books
WHERE
primary_author = @PrimaryAuthor;
END
GO
Helst är det vi skulle vilja göra något sånt här, där vi SELECT
den resulterande informationen från vår procedur och infoga den i en tillfällig tabell:
SELECT
*
INTO
#tmpSortedBooks
FROM
EXEC BooksByPrimaryAuthor 'Tolkien'
Problemet är syntaxen ovan är felaktig och fungerar inte . Vi behöver en ny metod.
Använda OPENROWSET-satsen
En möjlighet är att använda OPENROWSET
sats, som låter dig komma åt fjärrdata från en OLE DB-källa och kan köras direkt från en annan SQL-sats. OPENROWSET
är en metod för engångsanslutning och datahämtning, så den bör inte användas för frekventa anslutningar (att länka servrar är att föredra i så fall).
OPENROWSET
kan vara målet för vilken INSERT
som helst , DELETE
, eller UPDATE
uttalande, vilket gör det idealiskt för våra syften att "exekvera" vår lagrade procedur åt oss och extrahera dessa data tillbaka till vårt väntande tillfälliga bord.
Innan du använder OPENROWSET
, kan det vara nödvändigt att ändra vissa konfigurationsalternativ, särskilt genom att tillåta ad hoc-åtkomst. Detta kan konfigureras med hjälp av följande satser:
sp_configure 'Show Advanced Options', 1
GO
RECONFIGURE
GO
sp_configure 'Ad Hoc Distributed Queries', 1
GO
RECONFIGURE
GO
Nu kan vi använda OPENROWSET
, som har en viss syntax som måste följas:
OPENROWSET(
<PROVIDER_NAME>,
<DATA_SOURCE>,
<OPTIONS>
)
Därför kan vi utföra vår lagrade procedur genom OPENROWSET
och skicka det till vårt tillfälliga bord så här:
SELECT
*
INTO
#tmpSortedBooks
FROM
OPENROWSET(
'SQLNCLI',
'Server=(local)\SQL2008;Trusted_Connection=yes;',
'EXEC BooksByPrimaryAuthor Tolkien'
)
Du kan behöva ändra PROVIDER_NAME
och DATA_SOURCE
värden för dina egna syften.
Använda en användardefinierad funktion
Det finns några nackdelar med OPENROWSET
metod, nämligen att den kräver ad hoc-behörigheter/konfiguration som vi såg ovan, och även OPENROWSET
kan endast returnera en enda resultatuppsättning (om flera uppsättningar tillhandahålls returneras endast den första resultatuppsättningen).
Därför är en annan metod för att utföra denna uppgift att effektivt ersätta den lagrade proceduren med en användardefinierad funktion istället.
Från vårt exempel skulle det se ut ungefär så här:
CREATE FUNCTION BooksByPrimaryAuthor
(
@PrimaryAuthor nvarchar(100)
)
RETURNS TABLE
AS
RETURN
SELECT
*
FROM
books
WHERE
primary_author = @PrimaryAuthor;
GO
Denna funktion kan sedan användas ungefär på samma sätt som önskat ovan med OPENROWSET
:
SELECT
*
INTO
#tmpSortedBooks
FROM
BooksByPrimaryAuthor('Tolkien')
Om du verkligen behöver en lagrad procedur kan du också lägga in din funktion i en lagrad procedur.