sql >> Databáze >  >> RDS >> Database

Předávání datové tabulky jako parametru do uložených procedur

Databázové aplikace v reálném světě potřebují provádět více požadavků z frontendu do databáze, aby mohly provádět nejrůznější funkce.

Pokud je aplikace náročná na data, jako jsou aplikace používané v bankách nebo na letištích atd., může být počet datových cest obrovský. Každý požadavek do databáze využívá šířku pásma a vyžaduje čas na provedení. Bez parametrů s hodnotou tabulky musí přední aplikace provést více datových výletů, aby mohla manipulovat s více řádky dat. S parametry s hodnotou tabulky však lze vložit, aktualizovat a odstranit více řádků z databáze pomocí jediného parametrizovaného příkazu, který přebírá parametr s hodnotou tabulky.

Parametr s hodnotou tabulky je parametr s typem tabulky. Pomocí tohoto parametru můžete odeslat více řádků dat do uložené procedury nebo parametrizovaného příkazu SQL ve formě tabulky. Transact-SQL lze použít pro přístup k hodnotám sloupců parametrů s hodnotou tabulky.

V tomto článku budeme studovat, jak můžeme předat datovou tabulku do uložené procedury. Předtím se však podívejme, jak se tabulková data předávala před parametry s tabulkovou hodnotou.

Předávání dat v tabulkové formě před tabulkovými hodnotnými parametry

Parametry s hodnotou tabulky byly zavedeny v SQL Server 2008. Předtím existovaly omezené možnosti předávání tabulkových dat uloženým procedurám. Většina vývojářů použila jednu z následujících metod:

  1. Data ve více sloupcích a řádcích byla reprezentována ve formě řady parametrů. Maximální počet parametrů, které lze předat uložené proceduře SQL Server, je však 2 100. V případě velkého stolu tedy tato metoda nemohla být použita. Dále je vyžadováno předběžné zpracování na straně serveru, aby se jednotlivé parametry zformátovaly do tabulkové podoby.
  2. Vytvořte více příkazů SQL, které mohou ovlivnit více řádků, například UPDATE. Výpisy lze zasílat na server jednotlivě nebo v dávkové formě. I když jsou odesílány v dávkové formě, jsou výpisy prováděny individuálně na serveru.
  3. Dalším způsobem je použití řetězců s oddělovači nebo dokumentů XML ke spojení dat z více řádků a sloupců a poté předání těchto textových hodnot parametrizovaným příkazům SQL nebo uloženým procedurám. Nevýhodou tohoto přístupu bylo, že bylo nutné ověřit datovou strukturu, abyste mohli rozdělit hodnoty.

Předávání datové tabulky jako parametru do uložených procedur

Nyní se podívejme, jak lze parametry s hodnotou tabulky použít k odesílání dat do uložené procedury, aniž by se musel potýkat s některým z problémů diskutovaných v předchozí části. Parametry s hodnotou tabulky umožňují předání více řádků dat do uložené procedury pomocí některého kódu Transact-SQL nebo z front-endové aplikace. Maximální velikost, kterou může mít parametr s hodnotou tabulky, se rovná maximální velikosti paměti databázového serveru.

V této části použijeme parametry s hodnotou tabulky spolu s uloženou procedurou k vložení více řádků do datové tabulky.

Předání parametrů s hodnotou tabulky do uložené procedury se skládá ze tří kroků:

  1. Vytvořte uživatelsky definovaný typ tabulky, který odpovídá tabulce, kterou chcete naplnit.
  2. Předejte uživatelsky definovanou tabulku do uložené procedury jako parametr
  3. Uvnitř uložené procedury vyberte data z předávaného parametru a vložte je do tabulky, kterou chcete naplnit.

Podívejme se na příklad toho, jak můžeme předat datovou tabulku do uložené procedury pomocí funkce s hodnotou tabulky.

Nejprve vytvořte tabulku, kterou chceme naplnit. Spusťte následující skript:

CREATE DATABASE ShowRoom


USE ShowRoom
Create Table Cars
(
    Id int primary key,
    Name nvarchar(50),
    company nvarchar(50)
)
Go

Ve výše uvedeném skriptu vytvoříme databázi s názvem ShowRoom s jednou tabulkou, tedy Auta. Tabulka Cars má tři sloupce:Id, Name a company. K naplnění tabulky Cars použijeme uloženou proceduru.

Jak bylo popsáno dříve, prvním krokem je vytvoření uživatelem definovaného typu tabulky, který odpovídá tabulce, kterou chcete naplnit. Chcete-li to provést, spusťte následující skript:

CREATE TYPE CarTableType AS TABLE
(
     Id int primary key,
    Name nvarchar(50),
    company nvarchar(50)
)
Go

Ve skriptu výše vytvoříme uživatelsky definovanou proměnnou CarTableType typu Tabulka. Toto je proměnná, kterou předáme uložené proceduře. Je vidět, že sloupce proměnné CarTableType jsou podobné sloupcům v tabulce Cars.

Nyní vytvoříme uloženou proceduru, která přijímá proměnnou CarTableType jako parametr. Uvnitř uložené procedury VYBEREME všechny záznamy z této proměnné a vložíme je do tabulky Cars. K vytvoření takové uložené procedury spusťte následující skript:

CREATE PROCEDURE spInsertCars
@CarType CarTableType READONLY
AS
BEGIN
    INSERT INTO Cars
    SELECT * FROM @CarType
END

Ve výše uvedeném skriptu vytvoříme uloženou proceduru spInsertCars. Je důležité zmínit, že musíte zadat uživatelsky definovaný parametr jako READONLY uvnitř uložené procedury, pokud tak neučiníte, dojde k chybě běhu.

Můžete vidět, že uložená procedura spInsertCars přijímá parametr CarTableType a přiřazuje jej k proměnné @CarType typu CarTableType.

Posledním krokem je vytvořit proměnnou proměnné CarTableType, naplnit ji fiktivními daty a předat ji uložené proceduře spInsertCars. Podívejte se na následující skript:

DECLARE @CarTableType CarTableType

INSERT INTO @CarTableType VALUES (1, 'Corrolla', 'Toyota')
INSERT INTO @CarTableType VALUES (2, 'Civic', 'Honda')
INSERT INTO @CarTableType VALUES (3, '6', 'Audi')
INSERT INTO @CarTableType VALUES (4, 'c100', 'Mercedez')
INSERT INTO @CarTableType VALUES (5, 'Mustang', 'Ford')

EXECUTE spInsertCars @CarTableType

Ve skriptu výše nejprve deklarujeme proměnnou @CarTableType typu CarTableType. Do této proměnné pak vložíme 5 fiktivních záznamů. Nakonec provedeme uloženou proceduru spInsertCars a předáme jí proměnnou @CarTableType jako parametr.

Uvnitř uložené procedury je vybráno pět záznamů z proměnné @CarTableType a vloženy do tabulky Cars. Pokud nyní vyberete všechny záznamy z tabulky Cars, měli byste vidět nově vložené záznamy. Chcete-li to provést, spusťte následující skript:

SELECT * FROM Cars

Výstup výše uvedeného skriptu vypadá takto:

Z výstupu je vidět, že všechny záznamy z proměnné @CarTableType byly vloženy do tabulky Cars.


  1. SQL Levé připojení

  2. PostgreSql 'PDOException' se zprávou 'nelze najít ovladač'

  3. Nejlepší způsob, jak zkontrolovat prázdnou nebo nulovou hodnotu

  4. Co je jedinečné omezení v SQL Server - SQL Server / TSQL výukový program, část 95