V některých případech se SQL Serverem může nastat případ, kdy si přejete vzít výsledná data z uložené procedury a vložit je do dočasné tabulky pro použití v jiném dotazu. Určit, jak tento úkol splnit, může být poněkud obtížné, proto stručně nastíníme několik možností v závislosti na vašich konkrétních potřebách a konfiguraci databáze.
Než prozkoumáme konkrétní metody, vytvořte si příklad postupu. I když to není příliš užitečné, pojďme vytvořit BooksByPrimaryAuthor
procedura, která přijímá @PrimaryAuthor
parametr a získává záznamy z našich books
tabulka, kde je @PrimaryAuthor
zápasy. Příkaz generování procedury může vypadat takto:
CREATE PROC BooksByPrimaryAuthor
@PrimaryAuthor nvarchar(100)
AS
BEGIN
SELECT
*
FROM
books
WHERE
primary_author = @PrimaryAuthor;
END
GO
V ideálním případě bychom chtěli udělat něco takového, kde SELECT
výsledná data z našeho postupu a vložte je do dočasné tabulky:
SELECT
*
INTO
#tmpSortedBooks
FROM
EXEC BooksByPrimaryAuthor 'Tolkien'
Problém je v tom, že výše uvedená syntaxe je nesprávná a nebude fungovat . Potřebujeme novou metodu.
Použití prohlášení OPENROWSET
Jednou z možností je použít OPENROWSET
příkaz, který umožňuje přistupovat ke vzdáleným datům ze zdroje OLE DB a lze jej spustit přímo z jiného příkazu SQL. OPENROWSET
je metoda jednorázového připojení a získávání dat, takže by se neměla používat pro častá připojení (v takovém případě je vhodnější propojit servery).
OPENROWSET
může být cílem libovolného INSERT
, DELETE
nebo UPDATE
prohlášení, díky čemuž je ideální pro naše účely „provádění“ uložené procedury za nás a extrahování těchto dat zpět do naší čekající dočasné tabulky.
Před použitím OPENROWSET
, může být nutné upravit některé možnosti konfigurace, konkrétně povolením přístupu ad hoc. To lze nakonfigurovat pomocí následujících příkazů:
sp_configure 'Show Advanced Options', 1
GO
RECONFIGURE
GO
sp_configure 'Ad Hoc Distributed Queries', 1
GO
RECONFIGURE
GO
Nyní můžeme použít OPENROWSET
, který má konkrétní syntaxi, kterou je třeba dodržet:
OPENROWSET(
<PROVIDER_NAME>,
<DATA_SOURCE>,
<OPTIONS>
)
Můžeme tedy provést naši uloženou proceduru prostřednictvím OPENROWSET
a předejte to naší dočasné tabulce takto:
SELECT
*
INTO
#tmpSortedBooks
FROM
OPENROWSET(
'SQLNCLI',
'Server=(local)\SQL2008;Trusted_Connection=yes;',
'EXEC BooksByPrimaryAuthor Tolkien'
)
Možná budete muset změnit PROVIDER_NAME
a DATA_SOURCE
hodnoty pro vaše vlastní účely.
Použití funkce definované uživatelem
OPENROWSET
má několik nevýhod metoda, totiž že vyžaduje ad hoc oprávnění/konfiguraci, jak jsme viděli výše, a také OPENROWSET
dokáže vrátit pouze jednu sadu výsledků (pokud je poskytnuto více sad, vrátí se pouze první sada výsledků).
Proto je další metodou k provedení tohoto úkolu efektivní nahrazení uložené procedury uživatelsky definovanou funkcí.
Z našeho příkladu by to vypadalo asi takto:
CREATE FUNCTION BooksByPrimaryAuthor
(
@PrimaryAuthor nvarchar(100)
)
RETURNS TABLE
AS
RETURN
SELECT
*
FROM
books
WHERE
primary_author = @PrimaryAuthor;
GO
Tuto funkci lze poté použít zhruba stejným způsobem, jak je požadováno výše, pomocí OPENROWSET
:
SELECT
*
INTO
#tmpSortedBooks
FROM
BooksByPrimaryAuthor('Tolkien')
V případě, že skutečně potřebujete uloženou proceduru, můžete svou funkci také zabalit do uložené procedury.