INSERT (Transact-SQL)

Platí pro:SQL ServerAzure SQL DatabaseSpravovaná instance Azure SQLAzure Synapse AnalyticsPdW (Analytics Platform System)Sklad v Microsoft FabricDatabá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.

Transact-SQL konvence syntaxe

Tip

Microsoft Fabric Data Warehouse je relační sklad v podnikovém měřítku na základu datového jezera s architekturou připravenou pro budoucnost, integrovanou AI a novými funkcemi. Pokud s datovými sklady začínáte, doporučujeme vám začít s „Fabric Data Warehouse“. Stávající úlohy dedikovaného SQL fondu mohou upgradovat na Fabric a získat tak přístup k novým funkcím napříč datovou vědou, analytikou v reálném čase a reportingem.

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>
Specifikuje dočasně pojmenovanou množinu výsledků, známou také jako společný tabulový výraz, definovanou v rámci 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 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.

Tabulková proměnná v rámci jejího rozsahu může být použita jako zdroj tabulky ve INSERT výroku.

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 INSERT pohled into multi-table musí používat column_list , který odkazuje pouze na sloupce z jedné základní tabulky. Pro více informací o aktualizovatelných zobrazeních viz 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 specifikovat nápovědy HOLDLOCK, SERIALIZABLE, READCOMMITTED, REPEATABLEREAD nebo UPDLOCK na tabulkách, které jsou cíli příkazůINSERT, bude v budoucí verzi SQL Server odstraněna. Tyto nápovědy neovlivňují výkon INSERT výroků. Vyhněte se jejich používání v nové vývojové práci a naplánujte úpravu aplikací, které je aktuálně používají.

Specifikace nápovědy TABLOCK v tabulce, která je cílem příkazu INSERT , má stejný efekt jako specifikace 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á nemovitost.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 musí být použito při vkládání explicitních hodnot do sloupce identity a SET IDENTITY_INSERT možnost 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 lokální rozdělené pohledy, distribuované rozdělené pohledy nebo vzdálené tabulky, nebo INSERT příkazy obsahující execute_statement. Klauzule OUTPUT INTO není podporována ve INSERT výrocích, 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.

Můžete použít konstruktor Transact-SQL řádků (také nazývaný konstruktor hodnoty tabulky) k určení více řádků v jednom INSERT příkazu. 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. DEFAULT 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 RESULT SETS v příkazu EXECUTE nelze specifikovat v ... INSERT Prohlášení EXEC.

Pokud se použije execute_statement s , INSERTmusí být každá množina 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.

Nelze specifikovat parametr s tabulkovou hodnotou jako cíl příkazu INSERT EXEC; nicméně může být specifikován jako zdroj v řetězci INSERT EXEC nebo uložené procedurě. Další informace naleznete v tématu Použití parametrů Table-Valued (databázový stroj).

<dml_table_source>
Specifikuje, že řádky vložené do cílové tabulky jsou ty, které jsou vráceny klauzulí OUTPUT u , UPDATE, , nebo MERGE příkazuINSERT, volitelně filtrované DELETEklauzulí WHERE. Pokud <je dml_table_source> specifikováno, cíl vnějšího INSERT tvrzení musí 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ý INSERT, UPDATE, DELETE, nebo MERGE příkaz, který vrací postižené řá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 UPDATE je nebo DELETE specifikován, nemůže být kurzorem založený UPDATE ani DELETE. 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í.

DEFAULT 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 najdete v tématu 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 najdete v tématu 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 najdete v tématu 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 najdete v tématu BULK INSERT (Transact-SQL).

Note

Pokud není zadaný seznam sloupců, vyvolá se syntaktická chyba.

Remarks

Pro informace specifické pro vkládání dat do SQL grafových tabulek viz INSERT (SQL graf).

Hint dotazu MAXDOP není podporován během INSERT operací SELECT, pokud část příkazu SELECT čte z externích zdrojů.

Osvědčené postupy

Použijte funkci @@ROWCOUNT k vrácení počtu vložených řádků klientské aplikaci. Pro více informací viz @@ROWCOUNT (Transact-SQL).

Osvědčené postupy pro hromadný import dat

Používám INSERT INTO... SELECT pro hromadný import dat s minimálním logováním a paralelismem

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 TABLOCK je určena pro cílovou tabulku.

Řádky, které jsou vloženy do haldy jako výsledek akce vložení do příkazu MERGE , mohou být také minimálně zaznamenány.

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 nastavený IDENTITY_INSERT na VYPNUTO.
  • Nápověda TABLOCK je 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.

Pro více informací o použití INSERT ve vašem skladu v Microsoft Fabric viz Ingest dat do vašeho skladu pomocí 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řijímat následující tabulkové nápovědy, které poskytují optimalizace hromadného zatížení pomocí příkazu INSERT :

  • Tip TABLOCK můž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 TABLOCK můž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_CONSTRAINTS může dočasně zakázat kontrolu omezení CIZÍ KLÍČ a CHECK.
  • Tip IGNORE_TRIGGERS může dočasně zakázat spuštění triggeru.
  • Tento KEEPDEFAULTS tip umožňuje vložení výchozí hodnoty sloupce tabulky, pokud existuje, místo hodnoty NULL, pokud záznam dat nemá hodnotu pro sloupec.
  • Tento KEEPIDENTITY tip 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 je hodnota načítána do sloupců s datovým typem char, varchar nebo varbinár , vyplňování nebo zkrácení koncových prázdných míst (mezery pro char a varchar, nuly pro varbinární) je určeno nastavením SET ANSI_PADDING definovaným pro sloupec při vytvoření tabulky. Další informace najdete 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 typu Point a vložení hodnoty do Cities tabulky.

    INSERT INTO Cities (Location)  
    VALUES ( dbo.CreateNewPoint(x, y) );  
    

Zpracování chyb

Řešení chyb pro příkaz INSERT můžete implementovat tím, že zadáte příkaz v TRY... CATCH konstrukce.

Pokud INSERT příkaz porušuje omezení nebo pravidlo, nebo pokud má hodnotu nekompatibilní s datovým typem sloupce, příkaz selže a je vrácena chybová zpráva.

Pokud INSERT se načítá více řádků pomocí SELECT nebo EXECUTE, jakékoli porušení pravidla nebo omezení, které vznikne při načítání hodnot, způsobí, že se příkaz zastaví a žádné řádky se nenačtou.

Když INSERT se během vyhodnocování výrazu vyskytne aritmetická chyba (přetečení, dělení nulou nebo chyba domény), Database Engine tyto chyby zpracovává, jako by SET ARITHABORT byl nastaven na ON. Dávka se zastaví a vrátí se chybová zpráva. Během vyhodnocování výrazu, když SET ARITHABORT aSET ANSI_WARNINGSSETjsou VYPNUTÉ, pokud INSERTpříkaz , DELETE nebo UPDATE narazí na aritmetickou chybu, přetečení, dělení nulou nebo chybu 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

Když INSTEAD OF je spouštěč definován na INSERT akce proti tabulce nebo pohledu, spustí se spouštěč místo příkazu INSERT . Pro více informací o INSTEAD OF spouštěčích viz 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.

Když se používá TOP s INSERT odkazovanými řádky, nejsou uspořádány v žádném pořadí a klauzule ORDER BY nemůže být přímo specifikována 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.

INSERT dotazy, které používají SELECT s ORDER BY k vyplnění řádků, zaručují, jak jsou hodnoty identity počítány, ale ne pořadí, v jakém jsou řádky vloženy.

V Parallel Data Warehouse je klauzule ORDER BY neplatná v VIEWS, CREATE TABLE AS SELECT, INSERT SELECT, inline funkcích, odvozených tabulkách, poddotazech a běžných tabulkových výrazech, pokud není také specifikován TOP.

Logovací chování

Příkaz je vždy plně zaznamenán, INSERT kromě 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í. Pro více informací viz "Bezpečnostní aspekty" v sekci Import Bulk Data by Using BULK INSERT nebo OPENROWSET(BULK...) (SQL Server).

Permissions

INSERT Na cílové tabulce je vyžadováno povolení.

INSERT Oprávnění jsou výchozí pro členy sysadmin pevné serverové role, db_owner a pevné databázové role a db_datawriter 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.

Pro spuštění INSERT s volbou BULK funkce OPENROWSET musíte být členem sysadmin role pevného serveru nebo bulkadmin role pevného serveru.

Examples

Category Doporučené prvky syntaxe
Základní syntaxe INSERT * konstruktor hodnoty tabulky
Zpracování hodnot sloupců IDENTITY * NEWID * výchozí hodnoty * uživatelem definované typy
Vkládání dat z jiných tabulek INSERT... VYBRAT * INSERT... EXECUTE * S běžným tabulovým výrazem * 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ů INSERT... SELECT * OPENROWSET funkce
Přepsání výchozího chování optimalizátoru dotazů pomocí tipů Rady k tabulce
Zachycení výsledků INSERT tvrzení Klauzule OUTPUT

Základní syntaxe

Příklady v této sekci ukazují základní funkčnost INSERT výroku 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 INSERT příkazu. 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 sekci ukazují metody vkládání hodnot do sloupců, které jsou definovány IDENTITY vlastností, DEFAULT hodnotou nebo jsou definovány pomocí datových typů, jako je uniqueidentifier nebo uživatelem definované sloupce typů.

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 vkládají řádky, které obsahují hodnoty pro některé sloupce, ale ne pro všechny. V posledním INSERT příkazu nejsou specifikovány žádné sloupce a pouze výchozí hodnoty jsou vloženy pomocí klauzule DEFAULT VALUES.

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 INSERT příkazy umožňují generovat identitní hodnoty pro nové řádky. Třetí INSERT příkaz přepíše IDENTITY vlastnost sloupce tímto tvrzením SETSET 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é pomocí INSERT... SELECT nebo INSERT... PROVÁDĚJ. 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í INSERT příkaz používá příkaz SELECT k odvození dat ze zdrojových tabulek (Employee, SalesPerson, a ) Personv databázi AdventureWorks2025 a uložení výsledné sady do tabulky EmployeeSales . Druhý INSERT příkaz používá klauzuli EXECUTE k volání uložené procedury obsahující příkaz SELECT a třetí INSERT používá klauzuli EXECUTE k odkazování na příkaz SELECT jako literální ř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. Výrok INSERT odkazuje na sloupce v běžném tabulkovém výrazu.

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 vybírá libovolných 5 řádků vrácených tímto 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ář. Poté použijte INSERT INTO k exportu dat z lokální SQL Server tabulky do externího datového zdroje. Příkaz INSERT INTO vytvoří cílový soubor nebo adresář, pokud neexistuje, a výsledky příkazu SELECT jsou exportovány na určené místo ve specifikované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 sekci ukazují dvě metody, jak hromadně načíst data 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 bylo zajištěno minimální logování, je obnovovací model databáze AdventureWorks2025 nastaven tak, aby BULK_LOGGED před vložením řádků a resetoval se na FULL po INTO INSERT ... 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 Import Bulk Data by Using 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 sekci ukazují, jak použít tabulkové nápovědy k dočasnému přepsání výchozího chování optimalizátoru dotazu 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 specifikuje, že na tabulce Production.Location je přijat exkluzivní (X) zámek a drží se 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ů INSERT prohlášení

Příklady v této sekci ukazují, jak použít klauzuli OUTPUT k vrácení informací z každého řádku ovlivněného příkazem INSERT , nebo na základě výrazů. 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í OUTPUT 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ří tabulku EmployeeSales a poté do ní vloží několik řádků pomocí příkazu INSERT SELECT pro získání 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 ve příkazu MERGE a vkládá tato data do jiné tabulky. Výpis MERGE aktualizuje sloupec Quantity tabulky ProductInventory denně na základě objednávek, 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. Specifikace štítku pomocí příkazu INSERT

Následující příklad ukazuje použití štítku s příkazem INSERT .

-- Uses AdventureWorks  
  
INSERT INTO DimCurrency   
VALUES (500, N'C1', N'Currency1')  
OPTION ( LABEL = N'label1' );  

Y. Použití štítku a dotazovací nápovědy s tímto tvrzením INSERT

Tento dotaz ukazuje základní syntaxi pro použití štítku a hint pro dotaz join s příkazem 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é

BULK INSERT (Transact-SQL)
DELETE (Transact-SQL)
EXECUTE (Transact-SQL)
OD (Transact-SQL)
IDENTITY (Vlastnost) (Transact-SQL)
NEWID (Transact-SQL)
SELECT (Transact-SQL)
UPDATE (Transact-SQL)
MERGE (Transact-SQL)
OUTPUT – klauzule (Transact-SQL)
Použití vložených a odstraněných tabulek