Vložení dat

Dokončeno

Transact-SQL poskytuje několik způsobů, jak vložit řádky do tabulky.

Příkaz INSERT

Příkaz INSERT slouží k přidání jednoho nebo více řádků do tabulky. Existuje několik forem příkazu.

Základní syntaxe jednoduchého příkazu INSERT je znázorněna níže:

INSERT [INTO] <Table> [(column_list)]
VALUES ([ColumnName or an expression or DEFAULT or NULL],…n)

Pomocí této formy příkazu INSERT s názvem INSERT VALUES můžete zadat sloupce, které budou obsahovat hodnoty, a pořadí, ve kterém budou data prezentována pro každý řádek vložený do tabulky. Column_list je nepovinný, ale doporučuje se. Bez column_list bude příkaz INSERT očekávat hodnotu pro každý sloupec v tabulce v pořadí, v jakém byly sloupce definovány. Hodnoty těchto sloupců můžete zadat také jako seznam oddělený čárkami.

Při výpisu hodnot klíčové slovo DEFAULT znamená předdefinovanou hodnotu, která byla zadána při vytvoření tabulky, bude použita. Existují tři způsoby, jak lze určit výchozí nastavení:

  • Pokud je sloupec definovaný tak, aby měl automaticky vygenerovanou hodnotu, použije se tato hodnota. Automaticky generované hodnoty budou popsány dále v tomto modulu.
  • Při vytvoření tabulky lze pro sloupec zadat výchozí hodnotu a tato hodnota se použije, pokud je zadána hodnota DEFAULT.
  • Pokud je sloupec definovaný tak, aby umožňoval hodnoty NULL a sloupec není automaticky vygenerovaný a nemá výchozí definici, hodnota NULL se vloží jako VÝCHOZÍ.

Podrobnosti o vytvoření tabulky jsou nad rámec tohoto modulu. Často je ale užitečné zjistit, jaké sloupce jsou v tabulce. Nejjednodušším způsobem je jednoduše spustit příkaz SELECT v tabulce, aniž byste vraceli žádné řádky. Pomocí podmínky WHERE, která nemůže být nikdy PRAVDA, nelze vrátit žádné řádky.

SELECT * FROM Sales.Promotion
WHERE 1 = 0;

Tento příkaz zobrazí všechny sloupce a jejich názvy, ale nezobrazí datové typy ani žádné vlastnosti, například jestli jsou povolené hodnoty NUL, nebo pokud jsou zadány výchozí hodnoty. Příklad výstupu dotazu může vypadat takto:

PromotionName

StartDate

ProductModelID

Discount

Notes

K vložení dat do této tabulky můžete použít příkaz INSERT, jak je znázorněno zde.

INSERT INTO Sales.Promotion (PromotionName,StartDate,ProductModelID,Discount,Notes)
VALUES
('Clearance Sale', '01/01/2021', 23, 0.1, '10% discount');

V tomto příkladu výše je možné seznam sloupců vynechat, protože zadáváme hodnotu pro každý sloupec ve správném pořadí:

INSERT INTO Sales.Promotion
VALUES
('Clearance Sale', '01/01/2021', 23, 0.1, '10% discount');

Předpokládejme, že tabulka je definovaná tak, aby se na sloupec StartDate použila výchozí hodnota aktuálního data a sloupec Poznámky umožňuje hodnoty NULL. Můžete označit, že chcete použít tyto hodnoty explicitně, například takto:

INSERT INTO Sales.Promotion
VALUES
('Pull your socks up', DEFAULT, 24, 0.25, NULL);

Případně můžete v příkazu INSERT vynechat hodnoty, v takovém případě se použije výchozí hodnota, pokud je definována, a pokud neexistuje žádná výchozí hodnota, ale sloupec povoluje hodnoty NUL, vloží se hodnota NULL. Pokud nezadáváte hodnoty pro všechny sloupce, musíte mít seznam sloupců označený hodnotami sloupců, které zadáváte.

INSERT INTO Sales.Promotion (PromotionName, ProductModelID, Discount)
VALUES
('Caps Locked', 2, 0.2);

Kromě vložení jednoho řádku najednou lze příkaz INSERT VALUES použít k vložení více řádků poskytnutím více množin hodnot oddělených čárkami. Sady hodnot jsou také odděleny čárkami, například takto:

(col1_val,col2_val,col3_val),
(col1_val,col2_val,col3_val)

Tento seznam hodnot se označuje jako konstruktor hodnot tabulky. Tady je příklad vložení dvou dalších řádků do tabulky pomocí konstruktoru hodnoty tabulky:

INSERT INTO Sales.Promotion
VALUES
('The gloves are off!', DEFAULT, 3, 0.25, NULL),
('The gloves are off!', DEFAULT, 4, 0.25, NULL);

VLOŽIT... VYBRAT

Kromě zadávání literálové sady hodnot v příkazu INSERT podporuje T-SQL také použití výsledků jiných operací k zadání hodnot pro INSERT. Výsledky příkazu SELECT nebo výstup uložené procedury můžete použít k zadání hodnot příkazu INSERT.

Chcete-li použít INSERT s vnořeným select, vytvořte příkaz SELECT, který nahradí klauzuli VALUES. Tento formulář s názvem INSERT SELECT umožňuje vložit sadu řádků vrácených dotazem SELECT do cílové tabulky. Použití funkce INSERT SELECT představuje stejné aspekty jako INSERT VALUES:

  • Volitelně můžete zadat seznam sloupců za názvem tabulky.
  • Pro každý sloupec je nutné zadat hodnoty sloupců nebo VÝCHOZÍ nebo NULL.

Použití příkazu INSERT SELECT znázorňuje následující syntaxi:

INSERT [INTO] <table or view> [(column_list)]
SELECT <column_list> FROM <table_list>...;

Poznámka:

Sady výsledků z uložených procedur (nebo dokonce dynamických dávek) se dají použít také jako vstup do příkazu INSERT. Tato forma FUNKCE INSERT s názvem INSERT EXEC je koncepčně podobná funkci INSERT SELECT a bude zohledňovat stejné aspekty. Uložené procedury ale můžou vracet více sad výsledků, takže je potřeba věnovat větší pozornost.

Následující příklad vloží více řádků pro nové povýšení s názvem Get Framed načtením ID modelu a názvu modelu z Production.ProductModel, tabulka pro každý model, který obsahuje "frame" v názvu.

INSERT INTO Sales.Promotion (PromotionName, ProductModelID, Discount, Notes)
SELECT DISTINCT 'Get Framed', m.ProductModelID, 0.1, '10% off ' + m.Name
FROM Production.ProductModel AS m
WHERE m.Name LIKE '%frame%';

Na rozdíl od poddotazu není vnořený select použitý s insertem uzavřen v závorkách.

VYBRAT... DO

Další možností pro vkládání řádků, která se podobá příkazu INSERT SELECT, je příkaz SELECT INTO. Největší rozdíl mezi funkcí INSERT SELECT a SELECT INTO spočívá v tom, že příkaz SELECT INTO nelze použít k vložení řádků do existující tabulky, protože vždy vytvoří novou tabulku založenou na výsledku příkazu SELECT. Každý sloupec v nové tabulce bude mít stejný název, datový typ a hodnotu null jako odpovídající sloupec (nebo výraz) v seznamu SELECT.

Pokud chcete použít SELECT INTO, přidejte DO <new_table_name> v klauzuli SELECT dotazu těsně před klauzuli FROM. Tady je příklad, který extrahuje data z tabulky Sales.SalesOrderHeader do nové tabulky s názvem Sales.Invoice..

SELECT SalesOrderID, CustomerID, OrderDate, PurchaseOrderNumber, TotalDue
INTO Sales.Invoice
FROM Sales.SalesOrderHeader;

Příkaz SELECT INTO selže, pokud již existuje tabulka s názvem zadaným po příkazu INTO. Po vytvoření je možné s ní zacházet jako s jakoukoli jinou tabulkou. Můžete si ho vybrat, spojit ho s jinými tabulkami nebo do ní vložit další řádky.