Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Platí pro:SQL Server
Azure SQL Database
Spravovaná instance
Azure SQLAzure Synapse Analytics
PdW (Analytics Platform System)
Sklad v Microsoft Fabric
Databáze SQL v Microsoft Fabric
Přidá jeden nebo více řádků do tabulky nebo zobrazení v SQL Serveru. Příklady najdete v tématu Příklady.
Syntax
Syntaxe pro SQL Server a Databázi Azure SQL Database a Prostředky infrastruktury SQL
-- Syntax for SQL Server and Azure SQL Database and Fabric SQL database
[ WITH <common_table_expression> [ ,...n ] ]
INSERT
{
[ TOP ( expression ) [ PERCENT ] ]
[ INTO ]
{ <object> | rowset_function_limited
[ WITH ( <Table_Hint_Limited> [ ...n ] ) ]
}
{
[ ( column_list ) ]
[ <OUTPUT Clause> ]
{ VALUES ( { DEFAULT | NULL | expression } [ ,...n ] ) [ ,...n ]
| derived_table
| execute_statement
| <dml_table_source>
| DEFAULT VALUES
}
}
}
[;]
<object> ::=
{
[ server_name . database_name . schema_name .
| database_name .[ schema_name ] .
| schema_name .
]
table_or_view_name
}
<dml_table_source> ::=
SELECT <select_list>
FROM ( <dml_statement_with_output_clause> )
[AS] table_alias [ ( column_alias [ ,...n ] ) ]
[ WHERE <search_condition> ]
[ OPTION ( <query_hint> [ ,...n ] ) ]
-- External tool only syntax
INSERT
{
[BULK]
{ database_name.schema_name.table_or_view_name | schema_name.table_or_view_name | table_or_view_name }
( <column_definition> )
[ WITH (
[ [ , ] CHECK_CONSTRAINTS ]
[ [ , ] FIRE_TRIGGERS ]
[ [ , ] KEEP_NULLS ]
[ [ , ] KILOBYTES_PER_BATCH = kilobytes_per_batch ]
[ [ , ] ROWS_PER_BATCH = rows_per_batch ]
[ [ , ] ORDER ( { column [ ASC | DESC ] } [ ,...n ] ) ]
[ [ , ] TABLOCK ]
) ]
}
[; ] <column_definition> ::=
column_name <data_type>
[ COLLATE collation_name ]
[ NULL | NOT NULL ]
<data type> ::=
[ type_schema_name . ] type_name
[ ( precision [ , scale ] | max ]
Syntaxe pro Azure Synapse Analytics a paralelní datový sklad a Microsoft Fabric Warehouse
-- Syntax for Azure Synapse Analytics and Parallel Data Warehouse and Microsoft Fabric
INSERT [INTO] { database_name.schema_name.table_name | schema_name.table_name | table_name }
[ ( column_name [ ,...n ] ) ]
{
VALUES ( { NULL | expression } )
| SELECT <select_criteria>
}
[ OPTION ( <query_option> [ ,...n ] ) ]
[;]
Arguments
S <common_table_expression>
Určuje dočasnou pojmenovanou sadu výsledků, označovanou také jako běžný výraz tabulky, definovanou v rámci rozsahu příkazu INSERT. Sada výsledků je odvozena z příkazu SELECT. Další informace najdete v tématu WITH common_table_expression (Transact-SQL).
TOP (výraz) [ PERCENT ]
Určuje počet nebo procento náhodných řádků, které budou vloženy.
výraz může být číslo nebo procento řádků. Další informace naleznete v tématu TOP (Transact-SQL).
INTO
Je volitelné klíčové slovo, které lze použít mezi funkcí INSERT a cílovou tabulkou.
server_name
platí pro: SQL Server 2008 (10.0.x) a novější.
Je název propojeného serveru, na kterém se nachází tabulka nebo zobrazení. server_name lze zadat jako název propojeného serveru nebo pomocí funkce OPENDATASOURCE .
Při zadání server_name jako odkazovaný server se vyžadují database_name a schema_name . Pokud je server_name zadán pomocí OPENDATASOURCE, database_name a schema_name nemusí platit pro všechny zdroje dat a podléhá schopnostem zprostředkovatele OLE DB, který přistupuje ke vzdálenému objektu.
database_name
platí pro: SQL Server 2008 (10.0.x) a novější.
Je název databáze.
schema_name
Je název schématu, do kterého patří tabulka nebo zobrazení.
table_or view_name
Je název tabulky nebo zobrazení, které má přijímat data.
Proměnnou tabulky v rámci oboru lze použít jako zdroj tabulky v příkazu INSERT.
Zobrazení, na které odkazuje table_or_view_name , musí být aktualizovatelné a odkazovat na přesně jednu základní tabulku v klauzuli FROM zobrazení. Například příkaz INSERT do zobrazení s více tabulkami musí používat column_list , který odkazuje pouze na sloupce z jedné základní tabulky. Další informace o aktualizovatelných zobrazeních naleznete v tématu CREATE VIEW (Transact-SQL).
rowset_function_limited
platí pro: SQL Server 2008 (10.0.x) a novější.
Je funkce OPENQUERY nebo OPENROWSET . Použití těchto funkcí podléhá schopnostem zprostředkovatele OLE DB, který přistupuje ke vzdálenému objektu.
S ( <table_hint_limited> [... n ] )
Určuje jeden nebo více tipů pro tabulku, které jsou povolené pro cílovou tabulku. Klíčové slovo WITH a závorky jsou povinné.
READPAST, NOLOCK a READUNCOMMITTED nejsou povoleny. Další informace o nápovědě k tabulce naleznete v tématu Rady tabulky (Transact-SQL).
Important
Možnost určit HOLDLOCK, SERIALIZABLE, READCOMMITTED, REPEATABLEREAD nebo UPDLOCK nápovědy pro tabulky, které jsou cílem příkazů INSERT, budou odebrány v budoucí verzi SQL Serveru. Tyto rady nemají vliv na výkon příkazů INSERT. Vyhněte se jejich používání v nové vývojové práci a naplánujte úpravu aplikací, které je aktuálně používají.
Zadání nápovědy TABLOCK v tabulce, která je cílem příkazu INSERT, má stejný účinek jako zadání nápovědy TABLOCKX. Na tabulce se převezme exkluzivní zámek.
(column_list)
Je seznam jednoho nebo více sloupců, do kterých chcete vložit data.
column_list musí být uzavřeny v závorkách a oddělené čárkami.
Pokud sloupec není v column_list, databázový stroj musí být schopen poskytnout hodnotu založenou na definici sloupce; v opačném případě nelze řádek načíst. Databázový stroj automaticky poskytuje hodnotu sloupce, pokud sloupec:
Má vlastnost IDENTITY. Použije se další přírůstková hodnota identity.
Má výchozí hodnotu. Použije se výchozí hodnota sloupce.
Obsahuje datový typ časového razítka . Použije se aktuální hodnota časového razítka.
Je nullable. Použije se hodnota null.
Je vypočítaný sloupec. Použije se počítaná hodnota.
column_list je nutné použít při vložení explicitních hodnot do sloupce identity a možnost SET IDENTITY_INSERT musí být pro tabulku zapnutá.
VÝSTUPNÍ klauzule
Vrátí vložené řádky jako součást operace vložení. Výsledky lze vrátit do aplikace pro zpracování nebo je vložit do tabulky nebo proměnné tabulky pro další zpracování.
Klauzule OUTPUT není podporována v příkazech DML, které odkazují na místní dělené zobrazení, distribuovaná rozdělená zobrazení nebo vzdálené tabulky nebo příkazy INSERT, které obsahují execute_statement. Klauzule OUTPUT INTO není podporována v příkazech INSERT, které obsahují <klauzuli> dml_table_source. Další informace o argumentech a chování této klauzule naleznete v tématu OUTPUT – klauzule (Transact-SQL).
VALUES
Představuje seznam nebo seznamy datových hodnot, které se mají vložit. Pro každý sloupec v column_list musí existovat jedna datová hodnota, pokud je zadána nebo v tabulce. Seznam hodnot musí být uzavřený v závorkách.
Pokud hodnoty v seznamu Hodnot nejsou ve stejném pořadí jako sloupce v tabulce nebo nemají hodnotu pro každý sloupec v tabulce, column_list se musí použít k explicitní zadání sloupce, který ukládá každou příchozí hodnotu.
Pomocí konstruktoru Transact-SQL řádku (označovaného také jako konstruktor hodnoty tabulky) můžete zadat více řádků v jednom příkazu INSERT. Konstruktor řádku se skládá z jedné klauzule VALUES s více seznamy hodnot uzavřenými v závorkách a oddělených čárkami. Další informace naleznete v tématu Konstruktor hodnot tabulky (Transact-SQL).
Note
Konstruktor hodnot tabulky není ve službě Azure Synapse Analytics podporovaný. Místo toho je možné následující INSERT příkazy spustit a vložit více řádků. Ve službě Azure Synapse Analytics můžou být hodnoty vložení pouze konstantní hodnoty literálů nebo odkazy na proměnné. Pokud chcete vložit neslovný literál, nastavte proměnnou na hodnotu, která není konstantní, a vložte proměnnou.
DEFAULT
Vynutí, aby databázový stroj načetl výchozí hodnotu definovanou pro sloupec. Pokud pro sloupec neexistuje výchozí hodnota a sloupec povoluje hodnoty null, vloží se hodnota NULL. Pro sloupec definovaný datovým typem časového razítka se vloží další hodnota časového razítka. VÝCHOZÍ hodnota není platná pro sloupec identity.
expression
Je konstanta, proměnná nebo výraz. Výraz nemůže obsahovat příkaz EXECUTE.
Při odkazování na datové typy znaků Unicode nchar, nvarchar a ntext by měla být předpona výrazu velkým písmenem N. Pokud není zadán znak N, SQL Server převede řetězec na znakovou stránku, která odpovídá výchozí kolaci databáze nebo sloupce. V této znakové stránce se ztratí žádné znaky, které nebyly nalezeny.
derived_table
Je libovolný platný příkaz SELECT, který vrací řádky dat, které se mají načíst do tabulky. Příkaz SELECT nemůže obsahovat společný výraz tabulky (CTE).
execute_statement
Je jakýkoli platný příkaz EXECUTE, který vrací data s příkazy SELECT nebo READTEXT. Další informace naleznete v tématu EXECUTE (Transact-SQL).
Možnosti SADY VÝSLEDKŮ příkazu EXECUTE nelze zadat v příkazu INSERT... Příkaz EXEC.
Pokud se execute_statement používá s funkcí INSERT, musí být každá sada výsledků kompatibilní se sloupci v tabulce nebo v column_list.
execute_statement lze použít ke spouštění uložených procedur na stejném serveru nebo na vzdáleném serveru. Spustí se procedura na vzdáleném serveru a sady výsledků se vrátí na místní server a načtou se do tabulky na místním serveru. V distribuované transakci nelze vydat execute_statement vůči propojenému serveru zpětné smyčky, pokud má připojení povoleno více aktivních sad výsledků (MARS).
Pokud execute_statement vrátí data pomocí příkazu READTEXT, může každý příkaz READTEXT vrátit maximálně 1 MB (1024 kB) dat. execute_statement lze také použít s rozšířenými postupy. execute_statement vloží data vrácená hlavním vláknem rozšířené procedury; výstup z vláken jiných než hlavní vlákno však není vložen.
Parametr s hodnotou tabulky nelze zadat jako cíl příkazu INSERT EXEC; lze jej však zadat jako zdroj v řetězci INSERT EXEC nebo uložené procedury. Další informace naleznete v tématu Použití parametrů Table-Valued (databázový stroj).
<dml_table_source>
Určuje, že řádky vložené do cílové tabulky jsou vrácené výstupní klauzulí příkazu INSERT, UPDATE, DELETE nebo MERGE, volitelně filtrované klauzulí WHERE. Je-li <zadán dml_table_source> , musí cíl vnějšího příkazu INSERT splňovat následující omezení:
Musí to být základní tabulka, nikoli zobrazení.
Nemůže se jednat o vzdálenou tabulku.
Nemůže mít definované žádné aktivační události.
Nemůže se účastnit relací primárního klíče cizího klíče.
Nemůže se účastnit slučovací replikace nebo aktualizovatelných předplatných pro transakční replikaci.
Úroveň kompatibility databáze musí být nastavená na 100 nebo vyšší. Další informace naleznete v tématu VÝSTUPNÍ klauzule (Transact-SQL).
<select_list>
Je seznam oddělený čárkami určující sloupce vrácené klauzulí OUTPUT, které se mají vložit. Sloupce v <select_list> musí být kompatibilní se sloupci, do kterých se vkládají hodnoty.
<
> select_list nemůže odkazovat na agregační funkce ani TEXTPTR.
Note
Všechny proměnné uvedené v seznamu SELECT odkazují na jejich původní hodnoty bez ohledu na všechny změny provedené v <dml_statement_with_output_clause>.
<dml_statement_with_output_clause>
Je platný příkaz INSERT, UPDATE, DELETE nebo MERGE, který vrací ovlivněné řádky v klauzuli OUTPUT. Příkaz nemůže obsahovat klauzuli WITH a nemůže cílit na vzdálené tabulky nebo dělené zobrazení. Pokud je zadána funkce UPDATE nebo DELETE, nemůže se jednat o aktualizaci nebo odstranění založenou na kurzoru. Zdrojové řádky nelze odkazovat jako vnořené příkazy DML.
KDE <search_condition>
Je jakákoli klauzule WHERE obsahující platnou <search_condition> , která filtruje řádky vrácené <dml_statement_with_output_clause>. Další informace najdete v tématu podmínky hledání (Transact-SQL). Při použití v tomto kontextu <nesmí search_condition> obsahovat poddotazy, skalární uživatelem definované funkce, které provádějí přístup k datům, agregační funkce, TEXTPTR nebo predikáty fulltextového vyhledávání.
VÝCHOZÍ HODNOTY
platí pro: SQL Server 2008 (10.0.x) a novější.
Vynutí, aby nový řádek obsahoval výchozí hodnoty definované pro každý sloupec.
MNOŽSTVÍ
platí pro: SQL Server 2008 (10.0.x) a novější.
Používá se externími nástroji k nahrání binárního datového streamu. Tato možnost není určená pro použití s nástroji, jako jsou SQL Server Management Studio, SQLCMD, OSQL nebo aplikační programovací rozhraní pro přístup k datům, jako je sql Server Native Client.
FIRE_TRIGGERS
platí pro: SQL Server 2008 (10.0.x) a novější.
Určuje, že všechny triggery vložení definované v cílové tabulce se spustí během operace nahrání binárního datového proudu. Další informace naleznete v části BULK INSERT (Transact-SQL).
CHECK_CONSTRAINTS
platí pro: SQL Server 2008 (10.0.x) a novější.
Určuje, že všechna omezení cílové tabulky nebo zobrazení musí být kontrolována během operace nahrání binárního datového proudu. Další informace naleznete v části BULK INSERT (Transact-SQL).
KEEPNULLS
platí pro: SQL Server 2008 (10.0.x) a novější.
Určuje, že prázdné sloupce by měly zachovat hodnotu null během operace nahrání binárního datového proudu. Další informace najdete v tématu Zachování hodnot Null nebo použití výchozích hodnot při hromadném importu (SQL Server).
KILOBYTES_PER_BATCH = kilobytes_per_batch
Určuje přibližný počet kilobajtů (kB) dat na dávku jako kilobytes_per_batch. Další informace naleznete v části BULK INSERT (Transact-SQL).
ROWS_PER_BATCH =rows_per_batch
platí pro: SQL Server 2008 (10.0.x) a novější.
Určuje přibližný počet řádků dat v binárním datovém proudu. Další informace naleznete v části BULK INSERT (Transact-SQL).
Note
Pokud není zadaný seznam sloupců, vyvolá se syntaktická chyba.
Remarks
Informace týkající se vkládání dat do tabulek grafů SQL najdete v tématu INSERT (SQL Graph).
Hint dotazu MAXDOP není podporován během operací INSERT SELECT, pokud část příkazu SELECT čte z externích zdrojů.
Osvědčené postupy
Pomocí funkce @@ROWCOUNT vrátíte počet vložených řádků do klientské aplikace. Další informace naleznete v tématu @@ROWCOUNT (Transact-SQL).
Osvědčené postupy pro hromadný import dat
Použití funkce INSERT INTO... SELECT pro hromadný import dat s minimálním protokolováním a paralelismu
Můžete použít INSERT INTO <target_table> SELECT <columns> FROM <source_table> k efektivnímu přenosu velkého počtu řádků z jedné tabulky, například pracovní tabulky, do jiné tabulky s minimálním protokolováním. Minimální protokolování může zvýšit výkon příkazu a snížit možnost vyplnění dostupného prostoru transakčního protokolu během transakce.
Minimální protokolování pro tento příkaz má následující požadavky:
- Model obnovení databáze je nastavený na jednoduchý nebo hromadně protokolovaný.
- Cílová tabulka je prázdná nebo neprázdná halda.
- Cílová tabulka se při replikaci nepoužívá.
- Nápověda
TABLOCKje určena pro cílovou tabulku.
Řádky vložené do haldy v důsledku akce vložení v příkazu MERGE mohou být také minimální protokolované.
BULK INSERT Na rozdíl od příkazu, který obsahuje méně omezující zámek INSERT INTO … SELECT Hromadné aktualizace (BU) s TABLOCK nápovědou obsahuje výhradní zámek (X) v tabulce. To znamená, že nelze vložit řádky pomocí více operací vložení spuštěných současně.
Počínaje SQL Serverem 2016 (13.x) a úrovní kompatibility databáze 130 je však možné provést jeden INSERT INTO … SELECT příkaz paralelně při vkládání do hald nebo clusterovaných indexů columnstore (CCI). Paralelní vložení jsou možné při použití nápovědy TABLOCK .
Paralelismus výše uvedeného příkazu má následující požadavky, které se podobají požadavkům na minimální protokolování:
- Cílová tabulka je prázdná nebo neprázdná halda.
- Cílová tabulka obsahuje clusterovaný index columnstore (CCI), ale ne clusterované indexy.
- Cílová tabulka nemá sloupec identity s IDENTITY_INSERT nastaveným na VYPNUTO.
- Nápověda
TABLOCKje určena pro cílovou tabulku.
V situacích, kdy jsou splněny požadavky na minimální protokolování a paralelní vkládání, budou obě vylepšení spolupracovat, aby se zajistila maximální propustnost operací načítání dat.
Další informace o použití insert ve službě Warehouse v Microsoft Fabric najdete v tématu Ingestování dat do vašeho skladu pomocí jazyka Transact-SQL.
Note
Vložení do místních dočasných tabulek (identifikovaných předponou #) a globálních dočasných tabulek (identifikovaných předponami ##) jsou také povoleny pro paralelismus pomocí nápovědy TABLOCK.
Použití OPENROWSET a BULK k hromadnému importu dat
Funkce OPENROWSET může přijmout následující rady tabulky, které poskytují optimalizace hromadného načtení pomocí příkazu INSERT:
- Tip
TABLOCKmůže minimalizovat počet záznamů protokolu pro operaci vložení. Model obnovení databáze musí být nastavený na jednoduchý nebo hromadně protokolovaný a cílovou tabulku nelze použít při replikaci. Další informace najdete v tématu Požadavky pro minimální protokolování v hromadném importu. - Nápověda
TABLOCKmůže povolit paralelní operace vkládání. Cílová tabulka je halda nebo clusterovaný index columnstore (CCI) bez clusterovaných indexů a cílová tabulka nemůže mít zadaný sloupec identity. - Tip
IGNORE_CONSTRAINTSmůže dočasně zakázat kontrolu omezení CIZÍ KLÍČ a CHECK. - Tip
IGNORE_TRIGGERSmůže dočasně zakázat spuštění triggeru. - Tento
KEEPDEFAULTStip umožňuje vložení výchozí hodnoty sloupce tabulky, pokud existuje, místo hodnoty NULL, pokud záznam dat nemá hodnotu pro sloupec. - Tento
KEEPIDENTITYtip umožňuje použít hodnoty identity v importovaném datovém souboru pro sloupec identity v cílové tabulce.
Tyto optimalizace jsou podobné optimalizaci, které jsou k dispozici v BULK INSERT příkazu. Další informace naleznete v části Tipy pro tabulku (Transact-SQL).
Datové typy
Při vkládání řádků zvažte následující chování datového typu:
Pokud se hodnota načítá do sloupců s datovým typem char, varchar nebo varbinary , odsazení nebo zkrácení koncových prázdných hodnot (mezery pro znak a varchar, nuly pro varbinary) určuje nastavení SET ANSI_PADDING definované pro sloupec při vytvoření tabulky. Další informace naleznete v tématu SET ANSI_PADDING (Transact-SQL).
Následující tabulka ukazuje výchozí operaci pro SET ANSI_PADDING VYPNUTO.
Datový typ Výchozí operace char Hodnota oblasti s mezerami na definovanou šířku sloupce varchar Odeberte koncové mezery k poslednímu znaku, který není mezera, nebo na jeden znak pro řetězce tvořené pouze mezerami. varbinary Odeberte koncové nuly. Pokud se do sloupce s datovým typem varchar nebo text načte prázdný řetězec (' '), je výchozí operací načtení řetězce nulové délky.
Vložení hodnoty null do textového nebo obrázkového sloupce nevytváří platný textový ukazatel ani neuvolní textovou stránku o velikosti 8 kB.
Sloupce vytvořené s datovým typem uniqueidentifier ukládají speciálně formátované binární hodnoty 16 bajtů. Na rozdíl od sloupců identity databázový stroj negeneruje hodnoty pro sloupce s datovým typem uniqueidentifier . Během operace vložení lze proměnné s datovým typem uniqueidentifier a řetězcové konstanty ve formuláři xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx (36 znaků včetně pomlček, kde x je šestnáctková číslice v rozsahu 0–9 nebo a-f) použít pro sloupce uniqueidentifier . Například 6F9619FF-8B86-D011-B42D-00C04FC964FF je platná hodnota pro proměnnou nebo sloupec uniqueidentifier . K získání globálně jedinečného ID (GUID) použijte funkci NEWID( ).
Vložení hodnot do sloupců typu User-Defined
Hodnoty můžete do sloupců definovaného uživatelem vložit takto:
Zadání hodnoty uživatelem definovaného typu
Zadání hodnoty v systémovém datovém typu SQL Serveru, pokud uživatelem definovaný typ podporuje implicitní nebo explicitní převod z daného typu. Následující příklad ukazuje, jak vložit hodnotu do sloupce uživatelem definovaného typu
Pointexplicitně převodem z řetězce.INSERT INTO Cities (Location) VALUES ( CONVERT(Point, '12.3:46.2') );Binární hodnotu lze také zadat bez explicitního převodu, protože všechny uživatelem definované typy jsou implicitně konvertibilní z binárního souboru.
Volání uživatelem definované funkce, která vrací hodnotu uživatelem definovaného typu. Následující příklad používá uživatelem definovanou funkci
CreateNewPoint()k vytvoření nové hodnoty uživatelem definovaného typuPointa vložení hodnoty doCitiestabulky.INSERT INTO Cities (Location) VALUES ( dbo.CreateNewPoint(x, y) );
Zpracování chyb
Zpracování chyb pro příkaz INSERT můžete implementovat zadáním příkazu TRY... Konstruktor CATCH.
Pokud příkaz INSERT porušuje omezení nebo pravidlo nebo pokud má hodnotu nekompatibilní s datovým typem sloupce, příkaz selže a vrátí se chybová zpráva.
Pokud funkce INSERT načítá více řádků pomocí příkazu SELECT nebo EXECUTE, jakékoli porušení pravidla nebo omezení, ke kterému dochází z načtených hodnot, způsobí zastavení příkazu a nenačtou se žádné řádky.
Když příkaz INSERT narazí na aritmetickou chybu (přetečení, dělení nulou nebo chybou domény), ke které dochází během vyhodnocování výrazu, databázový stroj tyto chyby zpracuje, jako by set ARITHABORT byl nastaven na ZAPNUTO. Dávka se zastaví a vrátí se chybová zpráva. Při vyhodnocování výrazů, kdy set ARITHABORT a SET ANSI_WARNINGS jsou vypnuté, pokud příkaz INSERT, DELETE nebo UPDATE dojde k aritmetické chybě, přetečení, dělení nulou nebo chybě domény, SQL Server vloží nebo aktualizuje hodnotu NULL. Pokud cílový sloupec nemá hodnotu null, akce vložení nebo aktualizace selže a uživatel obdrží chybu.
Interoperability
Pokud je aktivační událost definována INSTEAD OF u akcí INSERT v tabulce nebo zobrazení, trigger se spustí místo příkazu INSERT. Další informace o aktivačních událostech najdete v INSTEAD OF tématu CREATE TRIGGER (Transact-SQL).
Limitace a omezení
Při vkládání hodnot do vzdálených tabulek a ne všech hodnot pro všechny sloupce je nutné identifikovat sloupce, do kterých se mají zadané hodnoty vkládat.
Pokud se funkce TOP používá s příkazem INSERT, odkazované řádky nejsou uspořádány v žádném pořadí a klauzule ORDER BY nelze přímo zadat v těchto příkazech. Pokud potřebujete použít top k vložení řádků do smysluplného chronologického pořadí, musíte použít TOP společně s klauzulí ORDER BY, která je zadaná v příkazu subselect. Podívejte se na část Příklady, která následuje v tomto tématu.
Dotazy INSERT, které používají SELECT s funkcí ORDER BY k naplnění řádků, zaručuje, jak se hodnoty identit počítají, ale ne pořadí, ve kterém se řádky vkládají.
V paralelním datovém skladu je klauzule ORDER BY neplatná v zobrazeních, CREATE TABLE AS SELECT, INSERT SELECT, vložené funkce, odvozené tabulky, poddotazy a běžné výrazy tabulky, pokud není zadána také top.
Logovací chování
Příkaz INSERT je vždy plně protokolován s výjimkou použití funkce OPENROWSET s klíčovým slovem BULK nebo při použití INSERT INTO <target_table> SELECT <columns> FROM <source_table>. Tyto operace se dají protokolovat minimálně. Další informace najdete v části Osvědčené postupy pro hromadné načítání dat dříve v tomto tématu.
Zabezpečení
Během připojení k propojenému serveru poskytuje odesílající server přihlašovací jméno a heslo pro připojení k přijímajícímu serveru svým jménem. Aby toto připojení fungovalo, musíte vytvořit mapování přihlášení mezi propojenými servery pomocí sp_addlinkedsrvlogin.
Při použití OPENROWSET(BULK...), je důležité pochopit, jak SQL Server zpracovává zosobnění. Další informace najdete v tématu Aspekty zabezpečení při importu hromadných dat pomocí funkce BULK INSERT nebo OPENROWSET(BULK...) (SQL Server).
Permissions
V cílové tabulce se vyžaduje oprávnění INSERT.
Oprávnění INSERT jsou výchozí pro členy sysadmin pevné role serveru, db_owner role a db_datawriter pevné databázové role a vlastníka tabulky. Členové rolí sysadmin, db_ownera db_securityadmin a vlastník tabulky může přenést oprávnění jiným uživatelům.
Chcete-li spustit funkci INSERT s funkcí OPENROWSET BULK, musíte být členem sysadmin pevné role serveru nebo bulkadmin pevné role serveru.
Examples
| Category | Doporučené prvky syntaxe |
|---|---|
| Základní syntaxe | INSERT * konstruktor hodnoty tabulky |
| Zpracování hodnot sloupců | IDENTITA * NEWID * výchozí hodnoty * uživatelem definované typy |
| Vkládání dat z jiných tabulek | VLOŽIT... SELECT * INSERT... EXECUTE * WITH common table expression * TOP * OFFSET FETCH |
| Určení jiných cílových objektů než standardní tabulky | Zobrazení * proměnné tabulky |
| Vložení řádků do vzdálené tabulky | Propojený server * Funkce sady řádků OPENQUERY * Funkce sady řádků OPENDATASOURCE |
| Hromadné načítání dat z tabulek nebo datových souborů | VLOŽIT... SELECT * OPENROWSET |
| Přepsání výchozího chování optimalizátoru dotazů pomocí tipů | Rady k tabulce |
| Zachycení výsledků příkazu INSERT | Klauzule OUTPUT |
Základní syntaxe
Příklady v této části ukazují základní funkce příkazu INSERT pomocí minimální požadované syntaxe.
A. Vložení jednoho řádku dat
Následující příklad vkládá jeden řádek do tabulky Production.UnitMeasure v databázi AdventureWorks2025. Sloupce v této tabulce jsou UnitMeasureCode, Namea ModifiedDate. Protože jsou zadány hodnoty pro všechny sloupce a jsou uvedeny ve stejném pořadí jako sloupce v tabulce, názvy sloupců nemusí být zadány v seznamu sloupců*.*
INSERT INTO Production.UnitMeasure
VALUES (N'FT', N'Feet', '20080414');
B. Vložení více řádků dat
Následující příklad používá konstruktor hodnoty tabulky k vložení tří řádků do tabulky Production.UnitMeasure v databázi AdventureWorks2025 v jednom příkazu INSERT. Protože jsou zadány hodnoty pro všechny sloupce a jsou uvedeny ve stejném pořadí jako sloupce v tabulce, názvy sloupců nemusí být zadány v seznamu sloupců.
Note
Konstruktor hodnot tabulky není ve službě Azure Synapse Analytics podporovaný.
INSERT INTO Production.UnitMeasure
VALUES (N'FT2', N'Square Feet ', '20080923'), (N'Y', N'Yards', '20080923')
, (N'Y3', N'Cubic Yards', '20080923');
C. Vložení dat, která nejsou ve stejném pořadí jako sloupce tabulky
Následující příklad používá seznam sloupců k explicitní zadání hodnot, které jsou vloženy do každého sloupce. Pořadí sloupců v tabulce Production.UnitMeasure v databázi AdventureWorks2025 je , UnitMeasureCodeName, ; ModifiedDatenicméně sloupce nejsou v tomto pořadí uvedeny v column_list.
INSERT INTO Production.UnitMeasure (Name, UnitMeasureCode,
ModifiedDate)
VALUES (N'Square Yards', N'Y2', GETDATE());
Zpracování hodnot sloupců
Příklady v této části ukazují metody vkládání hodnot do sloupců definovaných pomocí vlastnosti IDENTITY, VÝCHOZÍ hodnoty nebo jsou definovány s datovými typy, jako jsou například uniqueidentifier nebo sloupce typu definované uživatelem.
D. Vložení dat do tabulky se sloupci, které mají výchozí hodnoty
Následující příklad ukazuje vložení řádků do tabulky se sloupci, které automaticky generují hodnotu nebo mají výchozí hodnotu.
Column_1 je počítaný sloupec, který automaticky generuje hodnotu zřetězením řetězce s hodnotou vloženou do column_2.
Column_2 je definována s výchozím omezením. Pokud pro tento sloupec není zadaná hodnota, použije se výchozí hodnota.
Column_3 je definován s datovým typem rowversion , který automaticky generuje jedinečné a přírůstkové binární číslo.
Column_4 negeneruje hodnotu automaticky. Pokud není zadána hodnota pro tento sloupec, vloží se hodnota NULL. Příkazy INSERT vloží řádky, které obsahují hodnoty pro některé sloupce, ale ne všechny. V posledním příkazu INSERT nejsou zadány žádné sloupce a pomocí klauzule DEFAULT VALUES se vloží pouze výchozí hodnoty.
CREATE TABLE dbo.T1
(
column_1 AS 'Computed column ' + column_2,
column_2 varchar(30)
CONSTRAINT default_name DEFAULT ('my column default'),
column_3 rowversion,
column_4 varchar(40) NULL
);
GO
INSERT INTO dbo.T1 (column_4)
VALUES ('Explicit value');
INSERT INTO dbo.T1 (column_2, column_4)
VALUES ('Explicit value', 'Explicit value');
INSERT INTO dbo.T1 (column_2)
VALUES ('Explicit value');
INSERT INTO T1 DEFAULT VALUES;
GO
SELECT column_1, column_2, column_3, column_4
FROM dbo.T1;
GO
E. Vložení dat do tabulky se sloupcem identity
Následující příklad ukazuje různé metody vložení dat do sloupce identity. První dva příkazy INSERT umožňují vygenerovat hodnoty identity pro nové řádky. Třetí příkaz INSERT přepíše vlastnost IDENTITY pro sloupec příkazem SET IDENTITY_INSERT a vloží explicitní hodnotu do sloupce identity.
CREATE TABLE dbo.T1 ( column_1 int IDENTITY, column_2 VARCHAR(30));
GO
INSERT T1 VALUES ('Row #1');
INSERT T1 (column_2) VALUES ('Row #2');
GO
SET IDENTITY_INSERT T1 ON;
GO
INSERT INTO T1 (column_1,column_2)
VALUES (-99, 'Explicit identity value');
GO
SELECT column_1, column_2
FROM T1;
GO
F. Vložení dat do sloupce uniqueidentifier pomocí NEWID()
Následující příklad používá funkci NEWID() k získání identifikátoru GUID pro column_2. Na rozdíl od sloupců identit databázový stroj negeneruje hodnoty pro sloupce s datovým typem uniqueidentifier , jak je znázorněno druhým INSERT příkazem.
CREATE TABLE dbo.T1
(
column_1 int IDENTITY,
column_2 uniqueidentifier,
);
GO
INSERT INTO dbo.T1 (column_2)
VALUES (NEWID());
INSERT INTO T1 DEFAULT VALUES;
GO
SELECT column_1, column_2
FROM dbo.T1;
G. Vkládání dat do sloupců uživatelsky definovaných typů
Následující příkazy Transact-SQL vloží do PointValue sloupce Points tabulky tři řádky. Tento sloupec používá uživatelem definovaný typ CLR (UDT). Datový typ Point se skládá z celočíselné hodnoty X a Y, které jsou vystaveny jako vlastnosti UDT. K přetypování hodnot X a Y oddělených čárkami na Point typ je nutné použít funkci CAST nebo CONVERT. První dva příkazy používají funkci CONVERT k převodu řetězcové hodnoty na Point typ a třetí příkaz používá funkci CAST. Další informace naleznete v tématu Manipulace s daty UDT.
INSERT INTO dbo.Points (PointValue) VALUES (CONVERT(Point, '3,4'));
INSERT INTO dbo.Points (PointValue) VALUES (CONVERT(Point, '1,5'));
INSERT INTO dbo.Points (PointValue) VALUES (CAST ('1,99' AS Point));
Vkládání dat z jiných tabulek
Příklady v této části ukazují metody vkládání řádků z jedné tabulky do jiné tabulky.
H. Použití možností SELECT a EXECUTE k vložení dat z jiných tabulek
Následující příklad ukazuje, jak vložit data z jedné tabulky do jiné tabulky pomocí INSERT... SELECT nebo INSERT... PROVÉST. Každá je založená na příkazu SELECT s více tabulkami, který obsahuje výraz a hodnotu literálu v seznamu sloupců.
První příkaz INSERT používá příkaz SELECT k odvození dat ze zdrojových tabulek (Employee, , a Person) v databázi AdventureWorks2025 a ukládání výsledné sady do tabulky EmployeeSalesSalesPerson. Druhý příkaz INSERT používá klauzuli EXECUTE k volání uložené procedury, která obsahuje příkaz SELECT, a třetí INSERT používá klauzuli EXECUTE odkazovat příkaz SELECT jako literálový řetězec.
CREATE TABLE dbo.EmployeeSales
( DataSource varchar(20) NOT NULL,
BusinessEntityID varchar(11) NOT NULL,
LastName varchar(40) NOT NULL,
SalesDollars money NOT NULL
);
GO
CREATE PROCEDURE dbo.uspGetEmployeeSales
AS
SET NOCOUNT ON;
SELECT 'PROCEDURE', sp.BusinessEntityID, c.LastName,
sp.SalesYTD
FROM Sales.SalesPerson AS sp
INNER JOIN Person.Person AS c
ON sp.BusinessEntityID = c.BusinessEntityID
WHERE sp.BusinessEntityID LIKE '2%'
ORDER BY sp.BusinessEntityID, c.LastName;
GO
--INSERT...SELECT example
INSERT INTO dbo.EmployeeSales
SELECT 'SELECT', sp.BusinessEntityID, c.LastName, sp.SalesYTD
FROM Sales.SalesPerson AS sp
INNER JOIN Person.Person AS c
ON sp.BusinessEntityID = c.BusinessEntityID
WHERE sp.BusinessEntityID LIKE '2%'
ORDER BY sp.BusinessEntityID, c.LastName;
GO
--INSERT...EXECUTE procedure example
INSERT INTO dbo.EmployeeSales
EXECUTE dbo.uspGetEmployeeSales;
GO
--INSERT...EXECUTE('string') example
INSERT INTO dbo.EmployeeSales
EXECUTE
('
SELECT ''EXEC STRING'', sp.BusinessEntityID, c.LastName,
sp.SalesYTD
FROM Sales.SalesPerson AS sp
INNER JOIN Person.Person AS c
ON sp.BusinessEntityID = c.BusinessEntityID
WHERE sp.BusinessEntityID LIKE ''2%''
ORDER BY sp.BusinessEntityID, c.LastName
');
GO
--Show results.
SELECT DataSource,BusinessEntityID,LastName,SalesDollars
FROM dbo.EmployeeSales;
I. Použití common table expression with k definování vložených dat
Následující příklad vytváří tabulku NewEmployee v databázi AdventureWorks2025. Běžný výraz tabulky (EmployeeTemp) definuje řádky z jedné nebo více tabulek, které se mají vložit do NewEmployee tabulky. Příkaz INSERT odkazuje na sloupce ve společném výrazu tabulky.
CREATE TABLE HumanResources.NewEmployee
(
EmployeeID int NOT NULL,
LastName nvarchar(50) NOT NULL,
FirstName nvarchar(50) NOT NULL,
PhoneNumber Phone NULL,
AddressLine1 nvarchar(60) NOT NULL,
City nvarchar(30) NOT NULL,
State nchar(3) NOT NULL,
PostalCode nvarchar(15) NOT NULL,
CurrentFlag Flag
);
GO
WITH EmployeeTemp (EmpID, LastName, FirstName, Phone,
Address, City, StateProvince,
PostalCode, CurrentFlag)
AS (SELECT
e.BusinessEntityID, c.LastName, c.FirstName, pp.PhoneNumber,
a.AddressLine1, a.City, sp.StateProvinceCode,
a.PostalCode, e.CurrentFlag
FROM HumanResources.Employee e
INNER JOIN Person.BusinessEntityAddress AS bea
ON e.BusinessEntityID = bea.BusinessEntityID
INNER JOIN Person.Address AS a
ON bea.AddressID = a.AddressID
INNER JOIN Person.PersonPhone AS pp
ON e.BusinessEntityID = pp.BusinessEntityID
INNER JOIN Person.StateProvince AS sp
ON a.StateProvinceID = sp.StateProvinceID
INNER JOIN Person.Person as c
ON e.BusinessEntityID = c.BusinessEntityID
)
INSERT INTO HumanResources.NewEmployee
SELECT EmpID, LastName, FirstName, Phone,
Address, City, StateProvince, PostalCode, CurrentFlag
FROM EmployeeTemp;
GO
J. Omezení dat vložených ze zdrojové tabulky pomocí funkce TOP
Následující příklad vytváří tabulku EmployeeSales a vkládá jméno a data o prodejích od začátku roku pro 5 nejvybranějších zaměstnanců z tabulky HumanResources.Employee v databázi AdventureWorks2025. Příkaz INSERT vybere všechny 5 řádků vrácených příkazem SELECT . Klauzule OUTPUT zobrazí řádky vložené do EmployeeSales tabulky. Všimněte si, že klauzule ORDER BY v příkazu SELECT se nepoužívá k určení prvních 5 zaměstnanců.
CREATE TABLE dbo.EmployeeSales
( EmployeeID nvarchar(11) NOT NULL,
LastName nvarchar(20) NOT NULL,
FirstName nvarchar(20) NOT NULL,
YearlySales money NOT NULL
);
GO
INSERT TOP(5)INTO dbo.EmployeeSales
OUTPUT inserted.EmployeeID, inserted.FirstName,
inserted.LastName, inserted.YearlySales
SELECT sp.BusinessEntityID, c.LastName, c.FirstName, sp.SalesYTD
FROM Sales.SalesPerson AS sp
INNER JOIN Person.Person AS c
ON sp.BusinessEntityID = c.BusinessEntityID
WHERE sp.SalesYTD > 250000.00
ORDER BY sp.SalesYTD DESC;
Pokud chcete vložit řádky do smysluplného chronologického pořadí pomocí funkce TOP, musíte v příkazu dílčího výběru použít funkci TOP společně s příkazem ORDER BY, jak je znázorněno v následujícím příkladu. Klauzule OUTPUT zobrazí řádky vložené do EmployeeSales tabulky. Všimněte si, že prvních 5 zaměstnanců se teď vkládá na základě výsledků klauzule ORDER BY místo náhodných řádků.
INSERT INTO dbo.EmployeeSales
OUTPUT inserted.EmployeeID, inserted.FirstName,
inserted.LastName, inserted.YearlySales
SELECT TOP (5) sp.BusinessEntityID, c.LastName, c.FirstName, sp.SalesYTD
FROM Sales.SalesPerson AS sp
INNER JOIN Person.Person AS c
ON sp.BusinessEntityID = c.BusinessEntityID
WHERE sp.SalesYTD > 250000.00
ORDER BY sp.SalesYTD DESC;
Určení jiných cílových objektů než standardních tabulek
Příklady v této části ukazují, jak vložit řádky zadáním zobrazení nebo proměnné tabulky.
K. Vložení dat zadáním zobrazení
Následující příklad určuje název zobrazení jako cílový objekt; Nový řádek se však vloží do podkladové základní tabulky. Pořadí hodnot v INSERT příkazu musí odpovídat pořadí sloupců zobrazení. Další informace naleznete v tématu Úprava dat prostřednictvím zobrazení.
CREATE TABLE T1 ( column_1 int, column_2 varchar(30));
GO
CREATE VIEW V1 AS
SELECT column_2, column_1
FROM T1;
GO
INSERT INTO V1
VALUES ('Row 1',1);
GO
SELECT column_1, column_2
FROM T1;
GO
SELECT column_1, column_2
FROM V1;
GO
L. Vložení dat do proměnné tabulky
Následující příklad specifikuje proměnnou tabulky jako cílový objekt v databázi AdventureWorks2025.
-- Create the table variable.
DECLARE @MyTableVar table(
LocationID int NOT NULL,
CostRate smallmoney NOT NULL,
NewCostRate AS CostRate * 1.5,
ModifiedDate datetime);
-- Insert values into the table variable.
INSERT INTO @MyTableVar (LocationID, CostRate, ModifiedDate)
SELECT LocationID, CostRate, GETDATE()
FROM Production.Location
WHERE CostRate > 0;
-- View the table variable result set.
SELECT * FROM @MyTableVar;
GO
Vložení řádků do vzdálené tabulky
Příklady v této části ukazují, jak vložit řádky do vzdálené cílové tabulky pomocí propojeného serveru nebo funkce sady řádků pro odkazování na vzdálenou tabulku.
M. Vložení dat do vzdálené tabulky pomocí propojeného serveru
Následující příklad vloží řádky do vzdálené tabulky. Příklad začíná vytvořením propojení se vzdáleným zdrojem dat pomocí sp_addlinkedserver. Název propojeného serveru MyLinkServerje pak určen jako součást názvu objektu čtyřdílné ve formuláři server.catalog.schema.object.
platí pro: SQL Server 2008 (10.0.x) a novější.
USE master;
GO
-- Create a link to the remote data source.
-- Specify a valid server name for @datasrc as 'server_name'
-- or 'server_nameinstance_name'.
EXEC sp_addlinkedserver @server = N'MyLinkServer',
@srvproduct = N' ',
@provider = N'SQLNCLI',
@datasrc = N'server_name',
@catalog = N'AdventureWorks2022';
GO
-- Specify the remote data source in the FROM clause using a four-part name
-- in the form linked_server.catalog.schema.object.
INSERT INTO MyLinkServer.AdventureWorks2022.HumanResources.Department (Name, GroupName)
VALUES (N'Public Relations', N'Executive General and Administration');
GO
N. Vložení dat do vzdálené tabulky pomocí funkce OPENQUERY
Následující příklad vloží řádek do vzdálené tabulky zadáním funkce OPENQUERY rowset. V tomto příkladu se používá název propojeného serveru vytvořený v předchozím příkladu.
platí pro: SQL Server 2008 (10.0.x) a novější.
INSERT OPENQUERY (MyLinkServer,
'SELECT Name, GroupName
FROM AdventureWorks2022.HumanResources.Department')
VALUES ('Environmental Impact', 'Engineering');
GO
O. Vložení dat do vzdálené tabulky pomocí funkce OPENDATASOURCE
Následující příklad vloží řádek do vzdálené tabulky zadáním funkce OPENDATASOURCE rowset. Zadejte platný název serveru pro zdroj dat pomocí formátu server_name nebo server_name\instance_name.
platí pro: SQL Server 2008 (10.0.x) a novější.
-- Use the OPENDATASOURCE function to specify the remote data source.
-- Specify a valid server name for Data Source using the format
-- server_name or server_nameinstance_name.
INSERT INTO OPENDATASOURCE('SQLNCLI',
'Data Source= <server_name>; Integrated Security=SSPI')
.AdventureWorks2022.HumanResources.Department (Name, GroupName)
VALUES (N'Standards and Methods', 'Quality Assurance');
GO
P. Vložení do externí tabulky vytvořené pomocí PolyBase
Exportujte data z SQL Serveru do Hadoopu nebo Azure Storage. Nejprve vytvořte externí tabulku, která odkazuje na cílový soubor nebo adresář. Potom pomocí příkazu INSERT INTO exportujte data z místní tabulky SQL Serveru do externího zdroje dat. Příkaz INSERT INTO vytvoří cílový soubor nebo adresář, pokud neexistuje, a výsledky příkazu SELECT se exportují do zadaného umístění v zadaném formátu souboru. Další informace naleznete v tématu Začínáme s PolyBase.
Platí pro: SQL Server.
-- Create an external table.
CREATE EXTERNAL TABLE [dbo].[FastCustomers2009] (
[FirstName] char(25) NOT NULL,
[LastName] char(25) NOT NULL,
[YearlyIncome] float NULL,
[MaritalStatus] char(1) NOT NULL
)
WITH (
LOCATION='/old_data/2009/customerdata.tbl',
DATA_SOURCE = HadoopHDP2,
FILE_FORMAT = TextFileFormat,
REJECT_TYPE = VALUE,
REJECT_VALUE = 0
);
-- Export data: Move old data to Hadoop while keeping
-- it query-able via external table.
INSERT INTO dbo.FastCustomer2009
SELECT T.* FROM Insured_Customers T1 JOIN CarSensor_Data T2
ON (T1.CustomerKey = T2.CustomerKey)
WHERE T2.YearMeasured = 2009 and T2.Speed > 40;
Hromadné načítání dat z tabulek nebo datových souborů
Příklady v této části ukazují dvě metody hromadného načtení dat do tabulky pomocí příkazu INSERT.
Q. Vkládání dat do haldy s minimálním protokolováním
Následující příklad vytvoří novou tabulku (haldu) a vloží do ní data z jiné tabulky pomocí minimálního protokolování. Příklad předpokládá, že model AdventureWorks2025 obnovení databáze je nastaven na FULL. Aby se zajistilo, že se používá minimální protokolování, je model AdventureWorks2025 obnovení databáze nastavený na BULK_LOGGED před vložením řádků a resetováním hodnoty FULL za insert INTO... Příkaz SELECT. Kromě toho je pro cílovou tabulku Sales.SalesHistoryzadána nápověda TABLOCK . Tím se zajistí, že příkaz použije minimální prostor v transakčním protokolu a efektivně provede.
-- Create the target heap.
CREATE TABLE Sales.SalesHistory(
SalesOrderID int NOT NULL,
SalesOrderDetailID int NOT NULL,
CarrierTrackingNumber nvarchar(25) NULL,
OrderQty smallint NOT NULL,
ProductID int NOT NULL,
SpecialOfferID int NOT NULL,
UnitPrice money NOT NULL,
UnitPriceDiscount money NOT NULL,
LineTotal money NOT NULL,
rowguid uniqueidentifier ROWGUIDCOL NOT NULL,
ModifiedDate datetime NOT NULL );
GO
-- Temporarily set the recovery model to BULK_LOGGED.
ALTER DATABASE AdventureWorks2022
SET RECOVERY BULK_LOGGED;
GO
-- Transfer data from Sales.SalesOrderDetail to Sales.SalesHistory
INSERT INTO Sales.SalesHistory WITH (TABLOCK)
(SalesOrderID,
SalesOrderDetailID,
CarrierTrackingNumber,
OrderQty,
ProductID,
SpecialOfferID,
UnitPrice,
UnitPriceDiscount,
LineTotal,
rowguid,
ModifiedDate)
SELECT * FROM Sales.SalesOrderDetail;
GO
-- Reset the recovery model.
ALTER DATABASE AdventureWorks2022
SET RECOVERY FULL;
GO
R. Použití funkce OPENROWSET s funkcí BULK k hromadnému načtení dat do tabulky
Následující příklad vloží řádky z datového souboru do tabulky zadáním funkce OPENROWSET. Pro optimalizaci výkonu je zadána nápověda k tabulce IGNORE_TRIGGERS. Další příklady najdete v tématu Import hromadných dat pomocí funkce BULK INSERT nebo OPENROWSET(BULK...) (SQL Server).
platí pro: SQL Server 2008 (10.0.x) a novější.
INSERT INTO HumanResources.Department WITH (IGNORE_TRIGGERS) (Name, GroupName)
SELECT b.Name, b.GroupName
FROM OPENROWSET (
BULK 'C:SQLFilesDepartmentData.txt',
FORMATFILE = 'C:SQLFilesBulkloadFormatFile.xml',
ROWS_PER_BATCH = 15000)AS b ;
Přepsání výchozího chování optimalizátoru dotazů pomocí tipů
Příklady v této části ukazují, jak pomocí nápovědy k tabulce dočasně přepsat výchozí chování optimalizátoru dotazů při zpracování příkazu INSERT.
Caution
Vzhledem k tomu, že optimalizátor dotazů SQL Serveru obvykle vybírá nejlepší plán provádění dotazu, doporučujeme, aby se rady používaly pouze jako poslední možnost zkušenými vývojáři a správci databází.
S. Použití nápovědy TABLOCK k určení metody uzamčení
Následující příklad určuje, že výhradní zámek (X) je převzat v tabulce Production.Location a je uložen až do konce příkazu INSERT.
Platí pro: SQL Server, SQL Database.
INSERT INTO Production.Location WITH (XLOCK)
(Name, CostRate, Availability)
VALUES ( N'Final Inventory', 15.00, 80.00);
Zachycení výsledků příkazu INSERT
Příklady v této části ukazují, jak pomocí klauzule OUTPUT vracet informace z výrazů nebo výrazů na základě jednotlivých řádků ovlivněných příkazem INSERT. Tyto výsledky je možné vrátit do aplikace pro zpracování pro použití, jako jsou potvrzovací zprávy, archivace a další požadavky na aplikaci.
T. Použití výstupu s příkazem INSERT
Následující příklad vloží řádek do ScrapReason tabulky a pomocí OUTPUT klauzule vrátí výsledky příkazu do @MyTableVar proměnné tabulky. Vzhledem k tomu, že sloupec ScrapReasonID je definován s IDENTITY vlastností, hodnota není zadána INSERT v příkazu pro tento sloupec. Všimněte si však, že hodnota vygenerovaná databázovým strojem pro daný sloupec se vrátí v OUTPUT klauzuli ve sloupci INSERTED.ScrapReasonID .
DECLARE @MyTableVar table( NewScrapReasonID smallint,
Name varchar(50),
ModifiedDate datetime);
INSERT Production.ScrapReason
OUTPUT INSERTED.ScrapReasonID, INSERTED.Name, INSERTED.ModifiedDate
INTO @MyTableVar
VALUES (N'Operator error', GETDATE());
--Display the result set of the table variable.
SELECT NewScrapReasonID, Name, ModifiedDate FROM @MyTableVar;
--Display the result set of the table.
SELECT ScrapReasonID, Name, ModifiedDate
FROM Production.ScrapReason;
U. Použití výstupu s identitou a počítanými sloupci
Následující příklad vytvoří EmployeeSales tabulku a potom do ní vloží několik řádků pomocí příkazu INSERT s příkazem SELECT pro načtení dat ze zdrojových tabulek. Tabulka EmployeeSales obsahuje sloupec identity (EmployeeID) a vypočítaný sloupec (ProjectedSales). Vzhledem k tomu, že tyto hodnoty generuje databázový stroj během operace vložení, nelze v nich definovat @MyTableVaržádný z těchto sloupců .
CREATE TABLE dbo.EmployeeSales
( EmployeeID int IDENTITY (1,5)NOT NULL,
LastName nvarchar(20) NOT NULL,
FirstName nvarchar(20) NOT NULL,
CurrentSales money NOT NULL,
ProjectedSales AS CurrentSales * 1.10
);
GO
DECLARE @MyTableVar table(
LastName nvarchar(20) NOT NULL,
FirstName nvarchar(20) NOT NULL,
CurrentSales money NOT NULL
);
INSERT INTO dbo.EmployeeSales (LastName, FirstName, CurrentSales)
OUTPUT INSERTED.LastName,
INSERTED.FirstName,
INSERTED.CurrentSales
INTO @MyTableVar
SELECT c.LastName, c.FirstName, sp.SalesYTD
FROM Sales.SalesPerson AS sp
INNER JOIN Person.Person AS c
ON sp.BusinessEntityID = c.BusinessEntityID
WHERE sp.BusinessEntityID LIKE '2%'
ORDER BY c.LastName, c.FirstName;
SELECT LastName, FirstName, CurrentSales
FROM @MyTableVar;
GO
SELECT EmployeeID, LastName, FirstName, CurrentSales, ProjectedSales
FROM dbo.EmployeeSales;
V. Vložení dat vrácených z klauzule OUTPUT
Následující příklad zachycuje data vrácená z klauzule OUTPUT příkazu MERGE a vloží tato data do jiné tabulky. Příkaz MERGE aktualizuje Quantity sloupec tabulky ProductInventory denně na základě příkazů, které jsou zpracovány v tabulce SalesOrderDetail v databázi AdventureWorks2025. Odstraní také řádky pro produkty, jejichž inventář klesne na 0. Příklad zachycuje řádky, které jsou odstraněny, a vloží je do jiné tabulky, která sleduje produkty bez ZeroInventoryinventáře.
--Create ZeroInventory table.
CREATE TABLE Production.ZeroInventory (DeletedProductID int, RemovedOnDate DateTime);
GO
INSERT INTO Production.ZeroInventory (DeletedProductID, RemovedOnDate)
SELECT ProductID, GETDATE()
FROM
( MERGE Production.ProductInventory AS pi
USING (SELECT ProductID, SUM(OrderQty) FROM Sales.SalesOrderDetail AS sod
JOIN Sales.SalesOrderHeader AS soh
ON sod.SalesOrderID = soh.SalesOrderID
AND soh.OrderDate = '20070401'
GROUP BY ProductID) AS src (ProductID, OrderQty)
ON (pi.ProductID = src.ProductID)
WHEN MATCHED AND pi.Quantity - src.OrderQty <= 0
THEN DELETE
WHEN MATCHED
THEN UPDATE SET pi.Quantity = pi.Quantity - src.OrderQty
OUTPUT $action, deleted.ProductID) AS Changes (Action, ProductID)
WHERE Action = 'DELETE';
IF @@ROWCOUNT = 0
PRINT 'Warning: No rows were inserted';
GO
SELECT DeletedProductID, RemovedOnDate FROM Production.ZeroInventory;
W. Vkládání dat pomocí možnosti SELECT
Následující příklad ukazuje, jak vložit více řádků dat pomocí příkazu INSERT s možností SELECT. První INSERT příkaz používá SELECT příkaz přímo k načtení dat ze zdrojové tabulky a následnému uložení sady výsledků v EmployeeTitles tabulce.
CREATE TABLE EmployeeTitles
( EmployeeKey INT NOT NULL,
LastName varchar(40) NOT NULL,
Title varchar(50) NOT NULL
);
INSERT INTO EmployeeTitles
SELECT EmployeeKey, LastName, Title
FROM ssawPDW.dbo.DimEmployee
WHERE EndDate IS NULL;
X. Zadání popisku pomocí příkazu INSERT
Následující příklad ukazuje použití popisku s příkazem INSERT.
-- Uses AdventureWorks
INSERT INTO DimCurrency
VALUES (500, N'C1', N'Currency1')
OPTION ( LABEL = N'label1' );
Y. Použití popisku a nápovědy dotazu s příkazem INSERT
Tento dotaz zobrazuje základní syntaxi pro použití popisku a nápovědy ke spojení dotazu pomocí příkazu INSERT. Jakmile se dotaz odešle do řídicího uzlu, SQL Server spuštěný na výpočetních uzlech, použije strategii připojení hash, když vygeneruje plán dotazu SQL Serveru. Další informace o nápovědě ke spojení a o tom, jak používat klauzuli OPTION, naleznete v tématu OPTION (SQL Server PDW).
-- Uses AdventureWorks
INSERT INTO DimCustomer (CustomerKey, CustomerAlternateKey,
FirstName, MiddleName, LastName )
SELECT ProspectiveBuyerKey, ProspectAlternateKey,
FirstName, MiddleName, LastName
FROM ProspectiveBuyer p JOIN DimGeography g ON p.PostalCode = g.PostalCode
WHERE g.CountryRegionCode = 'FR'
OPTION ( LABEL = 'Add French Prospects', HASH JOIN);
Viz také
hromadné vložení (Transact-SQL)
DELETE (Transact-SQL)
EXECUTE (Transact-SQL)
FROM (Transact-SQL)
IDENTITY (vlastnost) (Transact-SQL)
NEWID (Transact-SQL)
SELECT (Transact-SQL)
AKTUALIZACE (Transact-SQL)
MERGE (Transact-SQL)
OUTPUT – klauzule (Transact-SQL)
Použití vložených a odstraněných tabulek