sql >> Databáze >  >> RDS >> Sqlserver

Jak vložit výsledky uložené procedury do dočasné tabulky na serveru SQL Server

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.


  1. Mechanismy pro sledování změn schématu DB

  2. Aktualizace tabulky Oracle z makra Excel VBA pomocí připojení ODBC

  3. Pronájem aut je stejně jednoduchý jako řízení:Datový model pro půjčovnu aut

  4. Odečtěte měsíc od data v MariaDB