Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
              Van toepassing op:SQL Server
Azure SQL Database
Azure SQL Managed Instance
Azure Synapse Analytics
Analytics Platform System (PDW)
Magazijn in Microsoft Fabric
SQL-database in Microsoft Fabric Preview
Voegt een of meer rijen toe aan een tabel of een weergave in SQL Server. Zie Voorbeelden voor voorbeelden.
              
              
              Transact-SQL syntaxis-conventies
Syntax
Syntaxis voor SQL Server en Azure SQL Database en Fabric SQL-database
-- 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 ]  
Syntaxis voor Azure Synapse Analytics en Parallel Data Warehouse en 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
MET <common_table_expression>
Hiermee geeft u de tijdelijke benoemde resultatenset, ook wel bekend als algemene tabelexpressie, gedefinieerd binnen het bereik van de INSERT-instructie. De resultatenset is afgeleid van een SELECT-instructie. Zie WITH common_table_expression (Transact-SQL)voor meer informatie.
TOP (expressie) [ PERCENT ]
Hiermee geeft u het aantal of het percentage willekeurige rijen op dat wordt ingevoegd. 
              expressie kan een getal of een percentage van de rijen zijn. Zie TOP (Transact-SQL)voor meer informatie.
INTO
Is een optioneel trefwoord dat kan worden gebruikt tussen INSERT en de doeltabel.
              server_name
              van toepassing op: SQL Server 2008 (10.0.x) en hoger.
Is de naam van de gekoppelde server waarop de tabel of weergave zich bevindt. server_name kan worden opgegeven als een gekoppelde servernaam of met behulp van de functie OPENDATASOURCE .
Wanneer server_name is opgegeven als een gekoppelde server, zijn database_name en schema_name vereist. Wanneer server_name is opgegeven met OPENDATASOURCE, zijn database_name en schema_name mogelijk niet van toepassing op alle gegevensbronnen en zijn ze onderhevig aan de mogelijkheden van de OLE DB-provider die toegang heeft tot het externe object.
              database_name
              van toepassing op: SQL Server 2008 (10.0.x) en hoger.
Is de naam van de database.
              schema_name
Is de naam van het schema waartoe de tabel of weergave behoort.
              table_or view_name
Is de naam van de tabel of weergave die de gegevens moet ontvangen.
Een tabelvariabele kan binnen het bereik ervan worden gebruikt als een tabelbron in een INSERT-instructie.
De weergave waarnaar wordt verwezen door table_or_view_name moet kunnen worden bijgewerkt en moet exact één basistabel in de FROM-component van de weergave verwijzen. Een INSERT in een weergave met meerdere tabellen moet bijvoorbeeld een column_list gebruiken die alleen verwijst naar kolommen uit één basistabel. Zie CREATE VIEW (Transact-SQL)voor meer informatie over bijwerkbare weergaven.
              rowset_function_limited
              van toepassing op: SQL Server 2008 (10.0.x) en hoger.
Is de functie OPENQUERY of OPENROWSET . Het gebruik van deze functies is onderhevig aan de mogelijkheden van de OLE DB-provider die toegang heeft tot het externe object.
WITH ( <table_hint_limited> [... n ] )
Hiermee geeft u een of meer tabelhints op die zijn toegestaan voor een doeltabel. Het sleutelwoord WITH en de haakjes zijn vereist.
READPAST, NOLOCK en READUNCOMMITTED zijn niet toegestaan. Zie tabelhints (Transact-SQL)voor meer informatie over tabelhints.
Important
De mogelijkheid om de HOLDLOCK-, SERIALIZABLE-, READCOMMITTED-, REPEATABLEREAD- of UPDLOCK-hints op tabellen op te geven die doelen zijn van INSERT-instructies, worden verwijderd in een toekomstige versie van SQL Server. Deze hints hebben geen invloed op de prestaties van INSERT-instructies. Vermijd het gebruik ervan in nieuwe ontwikkelwerkzaamheden en plan om toepassingen te wijzigen die deze momenteel gebruiken.
Het opgeven van de TABLOCK-hint voor een tabel die het doel van een INSERT-instructie is, heeft hetzelfde effect als het opgeven van de TABLOCKX-hint. Er wordt een exclusief slot op tafel gezet.
(column_list)
Is een lijst met een of meer kolommen waarin gegevens moeten worden ingevoegd. 
              column_list moet tussen haakjes staan en gescheiden door komma's.
Als een kolom zich niet in column_list bevindt, moet de database-engine een waarde kunnen opgeven op basis van de definitie van de kolom; anders kan de rij niet worden geladen. De database-engine levert automatisch een waarde voor de kolom als de kolom:
- Heeft een eigenschap IDENTITY. De volgende incrementele identiteitswaarde wordt gebruikt. 
- Heeft een standaardwaarde. De standaardwaarde voor de kolom wordt gebruikt. 
- Heeft een tijdstempelgegevenstype . De huidige tijdstempelwaarde wordt gebruikt. 
- Is nullable. Er wordt een null-waarde gebruikt. 
- Is een berekende kolom. De berekende waarde wordt gebruikt. 
column_list moet worden gebruikt wanneer expliciete waarden worden ingevoegd in een identiteitskolom en de optie SET IDENTITY_INSERT moet zijn ingeschakeld voor de tabel.
OUTPUT Clause
Retourneert ingevoegde rijen als onderdeel van de invoegbewerking. De resultaten kunnen worden geretourneerd naar de verwerkingstoepassing of worden ingevoegd in een tabel- of tabelvariabele voor verdere verwerking.
De OUTPUT-component wordt niet ondersteund in DML-instructies die verwijzen naar lokale gepartitioneerde weergaven, gedistribueerde gepartitioneerde weergaven of externe tabellen, of INSERT-instructies die een execute_statement bevatten. De COMPONENT OUTPUT INTO wordt niet ondersteund in INSERT-instructies die een <dml_table_source-component> bevatten. Zie OUTPUT-component (Transact-SQL)voor meer informatie over de argumenten en het gedrag van deze component.
VALUES
Introduceert de lijst of lijsten met gegevenswaarden die moeten worden ingevoegd. Er moet één gegevenswaarde zijn voor elke kolom in column_list, indien opgegeven, of in de tabel. De lijst met waarden moet tussen haakjes staan.
Als de waarden in de lijst Met waarden zich niet in dezelfde volgorde bevinden als de kolommen in de tabel of geen waarde hebben voor elke kolom in de tabel, moet column_list worden gebruikt om expliciet de kolom op te geven waarin elke binnenkomende waarde wordt opgeslagen.
U kunt de Transact-SQL rijconstructor (ook wel een tabelwaardeconstructor genoemd) gebruiken om meerdere rijen in één INSERT-instructie op te geven. De rijconstructor bestaat uit één VALUES-component met meerdere waardenlijsten tussen haakjes en gescheiden door een komma. Zie tabelwaardeconstructor (Transact-SQL)voor meer informatie.
Note
De tabelwaardeconstructor wordt niet ondersteund in Azure Synapse Analytics. In plaats daarvan kunnen volgende INSERT instructies worden uitgevoerd om meerdere rijen in te voegen. In Azure Synapse Analytics kunnen invoegwaarden alleen constante letterlijke waarden of variabele verwijzingen zijn. Als u een niet-letterlijke waarde wilt invoegen, stelt u een variabele in op een niet-constante waarde en voegt u de variabele in.
DEFAULT
Dwingt de database-engine om de standaardwaarde te laden die is gedefinieerd voor een kolom. Als er geen standaardwaarde bestaat voor de kolom en de kolom null-waarden toestaat, wordt NULL ingevoegd. Voor een kolom die is gedefinieerd met het gegevenstype tijdstempel , wordt de volgende tijdstempelwaarde ingevoegd. DEFAULT is niet geldig voor een identiteitskolom.
              expression
Is een constante, een variabele of een expressie. De expressie mag geen EXECUTE-instructie bevatten.
Wanneer u verwijst naar de Unicode-tekengegevenstypen nchar, nvarchar en ntext, moet 'expressie' worden voorafgegaan door de hoofdletter 'N'. Als N niet is opgegeven, converteert SQL Server de tekenreeks naar de codepagina die overeenkomt met de standaardsortering van de database of kolom. Alle tekens die niet op deze codepagina zijn gevonden, gaan verloren.
              derived_table
Is een geldige SELECT-instructie die rijen met gegevens retourneert die in de tabel moeten worden geladen. De SELECT-instructie kan geen algemene tabelexpressie (CTE) bevatten.
              execute_statement
Is een geldige EXECUTE-instructie die gegevens retourneert met SELECT- of READTEXT-instructies. Zie EXECUTE (Transact-SQL)voor meer informatie.
De opties VOOR RESULTATENSETs van de EXECUTE-instructie kunnen niet worden opgegeven in een INSERT... EXEC-instructie.
Als execute_statement wordt gebruikt met INSERT, moet elke resultatenset compatibel zijn met de kolommen in de tabel of in column_list.
execute_statement kan worden gebruikt voor het uitvoeren van opgeslagen procedures op dezelfde server of een externe server. De procedure op de externe server wordt uitgevoerd en de resultatensets worden geretourneerd naar de lokale server en in de tabel op de lokale server geladen. In een gedistribueerde transactie kan execute_statement niet worden uitgegeven op een gekoppelde loopback-server wanneer de verbinding meerdere actieve resultatensets (MARS) heeft ingeschakeld.
Als execute_statement gegevens retourneert met de READTEXT-instructie, kan elke READTEXT-instructie maximaal 1 MB (1024 kB) aan gegevens retourneren. execute_statement kan ook worden gebruikt met uitgebreide procedures. execute_statement de gegevens invoegen die worden geretourneerd door de hoofdthread van de uitgebreide procedure; Uitvoer van andere threads dan de hoofdthread wordt echter niet ingevoegd.
U kunt geen parameter met tabelwaarden opgeven als doel van een INSERT EXEC-instructie; Het kan echter worden opgegeven als een bron in de INSERT EXEC-tekenreeks of opgeslagen procedure. Zie Table-Valued Parameters (Database Engine) gebruiken voor meer informatie.
              <dml_table_source>
Hiermee geeft u op dat de rijen die zijn ingevoegd in de doeltabel, worden geretourneerd door de OUTPUT-component van een INSERT-, UPDATE-, DELETE- of MERGE-instructie, optioneel gefilterd op een WHERE-component. Als <dml_table_source> is opgegeven, moet het doel van de buitenste INSERT-instructie voldoen aan de volgende beperkingen:
- Het moet een basistabel zijn, geen weergave. 
- Het kan geen externe tabel zijn. 
- Er kunnen geen triggers worden gedefinieerd. 
- Het kan niet deelnemen aan relaties tussen primaire sleutels en refererende sleutels. 
- Het kan niet deelnemen aan samenvoegreplicatie of updatable abonnementen voor transactionele replicatie. 
Het compatibiliteitsniveau van de database moet worden ingesteld op 100 of hoger. Zie OUTPUT Component (Transact-SQL)voor meer informatie.
              <select_list>
Is een door komma's gescheiden lijst die aangeeft welke kolommen worden geretourneerd door de OUTPUT-component die moet worden ingevoegd. De kolommen in <select_list> moeten compatibel zijn met de kolommen waarin waarden worden ingevoegd. 
              <
              > select_list kan niet verwijzen naar statistische functies of TEKSTPTR.
Note
Variabelen die in de SELECT-lijst worden vermeld, verwijzen naar de oorspronkelijke waarden, ongeacht eventuele wijzigingen die in <dml_statement_with_output_clause> zijn aangebracht.
              <dml_statement_with_output_clause>
Is een geldige INSERT-, UPDATE-, DELETE- of MERGE-instructie die betrokken rijen in een OUTPUT-component retourneert. De instructie kan geen WITH-component bevatten en kan geen externe tabellen of gepartitioneerde weergaven targeten. Als UPDATE of DELETE is opgegeven, kan het geen op cursor gebaseerde UPDATE of DELETE zijn. Er kan niet naar bronrijen worden verwezen als geneste DML-instructies.
WHERE <search_condition>
Is een WHERE-component met een geldige <search_condition> waarmee de rijen worden gefilterd die door <dml_statement_with_output_clause> worden geretourneerd. Zie zoekvoorwaarde (Transact-SQL)voor meer informatie. Wanneer deze context wordt gebruikt, <kan search_condition> geen subquery's, scalaire door de gebruiker gedefinieerde functies bevatten waarmee gegevenstoegang, statistische functies, TEKSTPTR of zoekpredicaten in volledige tekst worden uitgevoerd.
DEFAULT VALUES
              van toepassing op: SQL Server 2008 (10.0.x) en hoger.
Hiermee dwingt u af dat de nieuwe rij de standaardwaarden bevat die voor elke kolom zijn gedefinieerd.
BULK
              van toepassing op: SQL Server 2008 (10.0.x) en hoger.
Wordt gebruikt door externe hulpprogramma's om een binaire gegevensstroom te uploaden. Deze optie is niet bedoeld voor gebruik met hulpprogramma's zoals SQL Server Management Studio, SQLCMD, OSQL of programmeerinterfaces voor gegevenstoegang, zoals SQL Server Native Client.
FIRE_TRIGGERS
              van toepassing op: SQL Server 2008 (10.0.x) en hoger.
Hiermee geeft u op dat eventuele invoegtriggers die zijn gedefinieerd in de doeltabel worden uitgevoerd tijdens de uploadbewerking van de binaire gegevensstroom. Zie BULK INSERT (Transact-SQL)voor meer informatie.
CHECK_CONSTRAINTS
              van toepassing op: SQL Server 2008 (10.0.x) en hoger.
Hiermee geeft u op dat alle beperkingen voor de doeltabel of weergave moeten worden gecontroleerd tijdens de uploadbewerking van de binaire gegevensstroom. Zie BULK INSERT (Transact-SQL)voor meer informatie.
KEEPNULLS
              van toepassing op: SQL Server 2008 (10.0.x) en hoger.
Hiermee geeft u op dat lege kolommen een null-waarde moeten behouden tijdens de uploadbewerking van de binaire gegevensstroom. Zie Null-waarden behouden of Standaardwaarden gebruiken tijdens bulkimport (SQL Server)voor meer informatie.
KILOBYTES_PER_BATCH = kilobytes_per_batch
Hiermee geeft u het geschatte aantal kilobytes (KB) van gegevens per batch op als kilobytes_per_batch. Zie BULK INSERT (Transact-SQL)voor meer informatie.
ROWS_PER_BATCH =rows_per_batch
              van toepassing op: SQL Server 2008 (10.0.x) en hoger.
Geeft het geschatte aantal rijen met gegevens in de binaire gegevensstroom aan. Zie BULK INSERT (Transact-SQL)voor meer informatie.
Note
Er wordt een syntaxisfout gegenereerd als er geen kolomlijst wordt opgegeven.
Remarks
Zie INSERT (SQL Graph) voor informatie over het invoegen van gegevens in SQL Graph-tabellen.
Best Practices
Gebruik de functie @@ROWCOUNT om het aantal ingevoegde rijen te retourneren aan de clienttoepassing. Zie @@ROWCOUNT (Transact-SQL)voor meer informatie.
Aanbevolen procedures voor het bulksgewijs importeren van gegevens
INSERT INTO gebruiken... SELECT om gegevens bulksgewijs te importeren met minimale logboekregistratie en parallelle uitvoering
U kunt een INSERT INTO <target_table> SELECT <columns> FROM <source_table> groot aantal rijen efficiënt overdragen van de ene tabel, zoals een faseringstabel, naar een andere tabel met minimale logboekregistratie. Minimale logboekregistratie kan de prestaties van de instructie verbeteren en de mogelijkheid verminderen dat de bewerking de beschikbare transactielogboekruimte tijdens de transactie vult.
Minimale logboekregistratie voor deze instructie heeft de volgende vereisten:
- Het herstelmodel van de database is ingesteld op eenvoudig of bulksgewijs vastgelegd.
- De doeltabel is een lege of niet-lege heap.
- De doeltabel wordt niet gebruikt in replicatie.
- De TABLOCKhint wordt opgegeven voor de doeltabel.
Rijen die in een heap worden ingevoegd als gevolg van een invoegactie in een MERGE-instructie, kunnen ook minimaal worden vastgelegd.
In tegenstelling tot de BULK INSERT instructie, die een minder beperkende BU-vergrendeling (Bulk Update) bevat, INSERT INTO … SELECT bevat de TABLOCK hint een exclusieve (X)-vergrendeling op de tabel. Dit betekent dat u geen rijen kunt invoegen met meerdere invoegbewerkingen die tegelijkertijd worden uitgevoerd.
Vanaf SQL Server 2016 (13.x) en databasecompatibiliteitsniveau 130 kan echter één INSERT INTO … SELECT instructie parallel worden uitgevoerd bij het invoegen in heaps of geclusterde columnstore-indexen (CCI). Parallelle invoegingen zijn mogelijk wanneer u de TABLOCK hint gebruikt.
Parallellisme voor de bovenstaande instructie heeft de volgende vereisten, die vergelijkbaar zijn met de vereisten voor minimale logboekregistratie:
- De doeltabel is een lege of niet-lege heap.
- De doeltabel heeft een geclusterde columnstore-index (CCI), maar geen niet-geclusterde indexen.
- De doeltabel heeft geen identiteitskolom met IDENTITY_INSERT ingesteld op UIT.
- De TABLOCKhint wordt opgegeven voor de doeltabel.
Voor scenario's waarin aan vereisten voor minimale logboekregistratie en parallelle invoeging wordt voldaan, werken beide verbeteringen samen om de maximale doorvoer van uw gegevensbelastingsbewerkingen te garanderen.
Zie Gegevens opnemen in uw warehouse met Behulp van Transact-SQL voor meer informatie over het gebruik van INSERT in uw warehouse in Microsoft Fabric.
Note
Invoegen in lokale tijdelijke tabellen (geïdentificeerd door het #-voorvoegsel) en globale tijdelijke tabellen (geïdentificeerd door ##-voorvoegsels) zijn ook ingeschakeld voor parallellisme met behulp van de TABLOCK-hint.
OPENROWSET en BULK gebruiken om gegevens bulksgewijs te importeren
De functie OPENROWSET kan de volgende tabelhints accepteren, die optimalisaties voor bulksgewijs laden bieden met de INSERT-instructie:
- De TABLOCKhint kan het aantal logboekrecords voor de invoegbewerking minimaliseren. Het herstelmodel van de database moet worden ingesteld op eenvoudig of bulksgewijs vastgelegd en de doeltabel kan niet worden gebruikt in replicatie. Zie Vereisten voor minimale logboekregistratie in bulkimport voor meer informatie.
- De TABLOCKhint kan parallelle invoegbewerkingen inschakelen. De doeltabel is een heap- of geclusterde columnstore-index (CCI) zonder niet-geclusterde indexen en de doeltabel kan geen identiteitskolom hebben opgegeven.
- Met de IGNORE_CONSTRAINTShint kunt u de controle van REFERERENDE SLEUTEL en CHECK-beperking tijdelijk uitschakelen.
- De IGNORE_TRIGGERShint kan de uitvoering van triggers tijdelijk uitschakelen.
- Met KEEPDEFAULTSde hint kan de standaardwaarde van een tabelkolom worden ingevoegd in plaats van NULL wanneer de gegevensrecord geen waarde voor de kolom bevat.
- Met KEEPIDENTITYde hint kunnen de identiteitswaarden in het geïmporteerde gegevensbestand worden gebruikt voor de identiteitskolom in de doeltabel.
Deze optimalisaties zijn vergelijkbaar met de optimalisaties die beschikbaar zijn met de BULK INSERT opdracht. Zie tabelhints (Transact-SQL)voor meer informatie.
Data Types
Houd rekening met het volgende gegevenstypegedrag wanneer u rijen invoegt:
- Als een waarde wordt geladen in kolommen met een gegevenstype char, varchar of varbinary , wordt de opvulling of afkapping van volgspaties (spaties voor teken en varchar, nullen voor varbinary) bepaald door de instelling SET ANSI_PADDING gedefinieerd voor de kolom toen de tabel werd gemaakt. Zie set ANSI_PADDING (Transact-SQL)voor meer informatie. - In de volgende tabel ziet u de standaardbewerking voor SET ANSI_PADDING OFF. - Data type - Default operation - char - Padwaarde met spaties tot de gedefinieerde breedte van de kolom. - varchar - Verwijder volgspaties tot het laatste niet-spatieteken of een teken met één spatie voor tekenreeksen die bestaan uit alleen spaties. - varbinary - Verwijder volgnullen. 
- Als een lege tekenreeks (' ') wordt geladen in een kolom met een varchar - of tekstgegevenstype , is de standaardbewerking het laden van een tekenreeks met lengte nul. 
- Als u een null-waarde in een tekst - of afbeeldingskolom invoegt, wordt er geen geldige tekstaanwijzer gemaakt en wordt ook geen 8 KB-tekstpagina toegewezen. 
- Kolommen die zijn gemaakt met het gegevenstype uniqueidentifier-archief dat speciaal is opgemaakt met binaire waarden van 16 bytes. In tegenstelling tot identiteitskolommen genereert de database-engine niet automatisch waarden voor kolommen met het gegevenstype uniqueidentifier . Tijdens een invoegbewerking kunnen variabelen met een gegevenstype uniqueidentifier en tekenreeksconstanten in het formulier xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxx (36 tekens, inclusief afbreekstreepjes, waarbij x een hexadecimaal cijfer is in het bereik 0-9 of a-f) worden gebruikt voor unieke identificatiekolommen . 6F9619FF-8B86-D011-B42D-00C04FC964FF is bijvoorbeeld een geldige waarde voor een uniekeidentifiervariabele of kolom. Gebruik de functie NEWID() om een GUID (Globally Unique ID) te verkrijgen. 
Waarden invoegen in User-Defined type kolommen
U kunt waarden invoegen in door de gebruiker gedefinieerde typekolommen door:
- Een waarde opgeven van het door de gebruiker gedefinieerde type. 
- Een waarde opgeven in een sql Server-systeemgegevenstype, zolang het door de gebruiker gedefinieerde type impliciete of expliciete conversie van dat type ondersteunt. In het volgende voorbeeld ziet u hoe u een waarde invoegt in een kolom van het door de gebruiker gedefinieerde type - Pointdoor expliciet te converteren vanuit een tekenreeks.- INSERT INTO Cities (Location) VALUES ( CONVERT(Point, '12.3:46.2') );- Een binaire waarde kan ook worden opgegeven zonder expliciete conversie uit te voeren, omdat alle door de gebruiker gedefinieerde typen impliciet converteerbaar zijn vanuit binair. 
- Een door de gebruiker gedefinieerde functie aanroepen die een waarde retourneert van het door de gebruiker gedefinieerde type. In het volgende voorbeeld wordt een door de gebruiker gedefinieerde functie - CreateNewPoint()gebruikt om een nieuwe waarde van het door de gebruiker gedefinieerde type- Pointte maken en de waarde in de tabel in te- Citiesvoegen.- INSERT INTO Cities (Location) VALUES ( dbo.CreateNewPoint(x, y) );
Error Handling
U kunt foutafhandeling voor de INSERT-instructie implementeren door de instructie op te geven in een TRY... CATCH-constructie.
Als een INSERT-instructie een beperking of regel schendt of als deze een waarde bevat die niet compatibel is met het gegevenstype van de kolom, mislukt de instructie en wordt er een foutbericht geretourneerd.
Als INSERT meerdere rijen laadt met SELECT of EXECUTE, wordt een schending van een regel of beperking die optreedt als gevolg van de waarden die worden geladen, de instructie gestopt en worden er geen rijen geladen.
Wanneer een INSERT-instructie een rekenkundige fout tegenkomt (overloop, delen door nul of een domeinfout) die optreedt tijdens de evaluatie van de expressie, verwerkt de database-engine deze fouten alsof SET ARITHABORT is ingesteld op AAN. De batch is gestopt en er wordt een foutbericht geretourneerd. Tijdens de evaluatie van de expressie wanneer SET ARITHABORT en SET ANSI_WARNINGS ZIJN UITGESCHAKELD, wordt een NULL-waarde ingevoegd of bijgewerkt als een INSERT-, DELETE- of UPDATE-instructie een rekenkundige fout, overloop, delen door nul of een domeinfout krijgt. Als de doelkolom niet nullable is, mislukt de actie invoegen of bijwerken en ontvangt de gebruiker een fout.
Interoperability
Wanneer een INSTEAD OF trigger is gedefinieerd voor INSERT-acties voor een tabel of weergave, wordt de trigger uitgevoerd in plaats van de INSERT-instructie. Zie INSTEAD OFvoor meer informatie over  triggers.
Beperkingen en beperkingen
Wanneer u waarden in externe tabellen invoegt en niet alle waarden voor alle kolommen zijn opgegeven, moet u de kolommen identificeren waaraan de opgegeven waarden moeten worden ingevoegd.
Wanneer TOP wordt gebruikt met INSERT, worden de rijen waarnaar wordt verwezen niet gerangschikt in een willekeurige volgorde en kan de ORDER BY-component niet rechtstreeks worden opgegeven in deze instructies. Als u TOP wilt gebruiken om rijen in een zinvolle chronologische volgorde in te voegen, moet u TOP gebruiken samen met een ORDER BY-component die is opgegeven in een subselectie-instructie. Zie de sectie Voorbeelden die volgt in dit onderwerp.
INSERT-query's die GEBRUIKMAKEN van SELECT met ORDER BY om rijen te vullen, garandeert hoe identiteitswaarden worden berekend, maar niet de volgorde waarin de rijen worden ingevoegd.
In Parallel Data Warehouse is de COMPONENT ORDER BY ongeldig in VIEWS, CREATE TABLE AS SELECT, INSERT SELECT, inlinefuncties, afgeleide tabellen, subquery's en algemene tabelexpressies, tenzij TOP ook is opgegeven.
Logging Behavior
De INSERT-instructie wordt altijd volledig geregistreerd, behalve wanneer u de functie OPENROWSET gebruikt met het trefwoord BULK of wanneer u deze gebruikt INSERT INTO <target_table> SELECT <columns> FROM <source_table>. Deze bewerkingen kunnen minimaal worden vastgelegd. Zie de sectie 'Aanbevolen procedures voor het bulksgewijs laden van gegevens' eerder in dit onderwerp voor meer informatie.
Security
Tijdens een gekoppelde serververbinding geeft de verzendende server een aanmeldingsnaam en wachtwoord op om namens de ontvangende server verbinding te maken met de ontvangende server. Als deze verbinding werkt, moet u een aanmeldingstoewijzing maken tussen de gekoppelde servers met behulp van sp_addlinkedsrvlogin.
Wanneer u OPENROWSET(BULK...) gebruikt, is het belangrijk om te begrijpen hoe SQL Server imitatie afhandelt. Zie 'Beveiligingsoverwegingen' in Bulkgegevens importeren met BULK INSERT of OPENROWSET(BULK...) (SQL Server) voor meer informatie.
Permissions
Insert-machtiging is vereist voor de doeltabel.
INSERT-machtigingen zijn standaard ingesteld op leden van de sysadmin vaste serverfunctie, de db_owner en db_datawriter vaste databaserollen en de eigenaar van de tabel. Leden van de sysadmin, db_owneren de db_securityadmin rollen, en de eigenaar van de tabel kan machtigingen overdragen aan andere gebruikers.
Als u INSERT wilt uitvoeren met de functie BULK van de functie OPENROWSET, moet u lid zijn van de sysadmin vaste serverfunctie of van de bulkadmin vaste serverfunctie.
Examples
| Category | Aanbevolen syntaxiselementen | 
|---|---|
| Basic syntax | INSERT * tabelwaardeconstructor | 
| Kolomwaarden verwerken | IDENTITY * NEWID * standaardwaarden * door de gebruiker gedefinieerde typen | 
| Gegevens uit andere tabellen invoegen | INVOEGEN... SELECT * INSERT... EXECUTE * WITH common table expression * TOP * OFFSET FETCH | 
| Doelobjecten opgeven die niet standaardtabellen zijn | Weergaven * tabelvariabelen | 
| Rijen invoegen in een externe tabel | Gekoppelde server * functie OPENQUERY-rijset * functie OPENDATASOURCE-rijset | 
| Gegevens bulksgewijs laden uit tabellen of gegevensbestanden | INVOEGEN... SELECT * OPENROWSET, functie | 
| Het standaardgedrag van de queryoptimalisatie overschrijven met behulp van hints | Table hints | 
| De resultaten van de INSERT-instructie vastleggen | OUTPUT clause | 
Basic Syntax
Voorbeelden in deze sectie laten de basisfunctionaliteit van de INSERT-instructie zien met behulp van de minimaal vereiste syntaxis.
A. Eén rij met gegevens invoegen
In het volgende voorbeeld wordt één rij in de Production.UnitMeasure tabel ingevoegd in de Database AdventureWorks2022. De kolommen in deze tabel zijn UnitMeasureCode, Nameen ModifiedDate. Omdat waarden voor alle kolommen worden opgegeven en worden weergegeven in dezelfde volgorde als de kolommen in de tabel, hoeven de kolomnamen niet te worden opgegeven in de kolomlijst*.*
INSERT INTO Production.UnitMeasure  
VALUES (N'FT', N'Feet', '20080414');  
B. Meerdere rijen met gegevens invoegen
In het volgende voorbeeld wordt de constructor voor tabelwaarden gebruikt om drie rijen in de tabel in de Production.UnitMeasure Database AdventureWorks2022 in één INSERT-instructie in te voegen. Omdat waarden voor alle kolommen worden opgegeven en in dezelfde volgorde worden weergegeven als de kolommen in de tabel, hoeven de kolomnamen niet in de kolomlijst te worden opgegeven.
Note
De tabelwaardeconstructor wordt niet ondersteund in Azure Synapse Analytics.
INSERT INTO Production.UnitMeasure  
VALUES (N'FT2', N'Square Feet ', '20080923'), (N'Y', N'Yards', '20080923')
    , (N'Y3', N'Cubic Yards', '20080923');  
C. Gegevens invoegen die zich niet in dezelfde volgorde bevinden als de tabelkolommen
In het volgende voorbeeld wordt een kolomlijst gebruikt om expliciet de waarden op te geven die in elke kolom worden ingevoegd. De kolomvolgorde in de Production.UnitMeasure tabel in de Database AdventureWorks2022 is , ModifiedDateNamemaar UnitMeasureCodede kolommen worden niet in die volgorde weergegeven in column_list.
INSERT INTO Production.UnitMeasure (Name, UnitMeasureCode,  
    ModifiedDate)  
VALUES (N'Square Yards', N'Y2', GETDATE());  
Kolomwaarden verwerken
Voorbeelden in deze sectie laten methoden zien voor het invoegen van waarden in kolommen die zijn gedefinieerd met een id-eigenschap, standaardwaarde of zijn gedefinieerd met gegevenstypen, zoals uniqueidentifier - of door de gebruiker gedefinieerde typekolommen.
D. Gegevens invoegen in een tabel met kolommen met standaardwaarden
In het volgende voorbeeld ziet u het invoegen van rijen in een tabel met kolommen die automatisch een waarde genereren of een standaardwaarde hebben. 
              Column_1 is een berekende kolom die automatisch een waarde genereert door een tekenreeks samen te voegen met de waarde die is ingevoegd in column_2. 
              Column_2 is gedefinieerd met een standaardbeperking. Als er geen waarde is opgegeven voor deze kolom, wordt de standaardwaarde gebruikt. 
              Column_3 wordt gedefinieerd met het gegevenstype rowversion , waarmee automatisch een uniek, incrementeel binair getal wordt gegenereerd. 
              Column_4 genereert niet automatisch een waarde. Wanneer er geen waarde voor deze kolom is opgegeven, wordt NULL ingevoegd. Met de INSERT-instructies worden rijen ingevoegd die waarden bevatten voor sommige kolommen, maar niet alle. In de laatste INSERT-instructie worden geen kolommen opgegeven en worden alleen de standaardwaarden ingevoegd met behulp van de component 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. Gegevens invoegen in een tabel met een identiteitskolom
In het volgende voorbeeld ziet u verschillende methoden voor het invoegen van gegevens in een identiteitskolom. Met de eerste twee INSERT-instructies kunnen identiteitswaarden worden gegenereerd voor de nieuwe rijen. De derde INSERT-instructie overschrijft de eigenschap IDENTITY voor de kolom met de instructie SET IDENTITY_INSERT en voegt een expliciete waarde in de identiteitskolom in.
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. Gegevens invoegen in een uniekeidentifier-kolom met behulp van NEWID()
In het volgende voorbeeld wordt de functie NEWID() gebruikt om een GUID voor column_2te verkrijgen. In tegenstelling tot identiteitskolommen genereert de database-engine niet automatisch waarden voor kolommen met het gegevenstype uniqueidentifier , zoals wordt weergegeven in de tweede INSERT instructie.
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. Gegevens invoegen in door de gebruiker gedefinieerde typekolommen
In de volgende Transact-SQL instructies worden drie rijen in de PointValue kolom van de Points tabel ingevoegd. In deze kolom wordt een door de gebruiker gedefinieerdE CLR-type (UDT) gebruikt. Het Point gegevenstype bestaat uit X- en Y-gehele getallen die worden weergegeven als eigenschappen van de UDT. U moet de functie CAST of CONVERT gebruiken om de door komma's gescheiden X- en Y-waarden naar het Point type te casten. De eerste twee instructies gebruiken de functie CONVERTEREN om een tekenreekswaarde te converteren naar het Point type en de derde instructie maakt gebruik van de CAST-functie. Zie UDT-gegevens bewerken voor meer informatie.
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));  
Gegevens uit andere tabellen invoegen
Voorbeelden in deze sectie laten methoden zien voor het invoegen van rijen uit de ene tabel in een andere tabel.
H. De opties SELECT en EXECUTE gebruiken om gegevens uit andere tabellen in te voegen
In het volgende voorbeeld ziet u hoe u gegevens uit de ene tabel in een andere tabel invoegt met behulp van INSERT... SELECTEREN of INVOEGEN... EXECUTEREN. Elk is gebaseerd op een SELECT-instructie met meerdere tabellen die een expressie en een letterlijke waarde in de kolomlijst bevat.
De eerste INSERT-instructie maakt gebruik van een SELECT-instructie om de gegevens af te leiden van de brontabellen (Employee, SalesPersonen Person) in de AdventureWorks2022-database en de resultatenset op te slaan in de EmployeeSales tabel. De tweede INSERT-instructie maakt gebruik van de EXECUTE-component om een opgeslagen procedure aan te roepen die de SELECT-instructie bevat en de derde INSERT gebruikt de EXECUTE-component om te verwijzen naar de SELECT-instructie als een letterlijke tekenreeks.
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. Veelgebruikte tabelexpressie gebruiken om de ingevoegde gegevens te definiëren
In het volgende voorbeeld wordt de NewEmployee tabel gemaakt in de Database AdventureWorks2022. Een algemene tabelexpressie (EmployeeTemp) definieert de rijen uit een of meer tabellen die in de NewEmployee tabel moeten worden ingevoegd. De INSERT-instructie verwijst naar de kolommen in de algemene tabelexpressie.
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. Top gebruiken om de gegevens te beperken die zijn ingevoegd uit de brontabel
In het volgende voorbeeld wordt de tabel EmployeeSales gemaakt en worden de naam en de verkoopgegevens van het jaar tot heden ingevoegd voor de top 5 willekeurige werknemers uit de tabel HumanResources.Employee in de database AdventureWorks2022. De INSERT-instructie kiest 5 rijen die door de SELECT instructie worden geretourneerd. In de OUTPUT-component worden de rijen weergegeven die in de EmployeeSales tabel zijn ingevoegd. U ziet dat de ORDER BY-component in de SELECT-instructie niet wordt gebruikt om de top 5 werknemers te bepalen.
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;  
Als u TOP moet gebruiken om rijen in te voegen in een zinvolle chronologische volgorde, moet u TOP samen met ORDER BY gebruiken in een subselectie-instructie, zoals wordt weergegeven in het volgende voorbeeld. In de OUTPUT-component worden de rijen weergegeven die in de EmployeeSales tabel zijn ingevoegd. U ziet dat de top 5 werknemers nu worden ingevoegd op basis van de resultaten van de ORDER BY-component in plaats van willekeurige rijen.
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;  
Doelobjecten opgeven die niet standaardtabellen zijn
Voorbeelden in deze sectie laten zien hoe u rijen invoegt door een weergave of tabelvariabele op te geven.
K. Gegevens invoegen door een weergave op te geven
In het volgende voorbeeld wordt een weergavenaam opgegeven als doelobject; de nieuwe rij wordt echter ingevoegd in de onderliggende basistabel. De volgorde van de waarden in de INSERT instructie moet overeenkomen met de kolomvolgorde van de weergave. Zie Gegevens wijzigen via een weergave-voor meer informatie.
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. Gegevens invoegen in een tabelvariabele
In het volgende voorbeeld wordt een tabelvariabele opgegeven als doelobject in de Database AdventureWorks2022.
-- 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  
Rijen invoegen in een externe tabel
Voorbeelden in deze sectie laten zien hoe u rijen invoegt in een externe doeltabel met behulp van een gekoppelde server of een rijsetfunctie om te verwijzen naar de externe tabel.
M. Gegevens invoegen in een externe tabel met behulp van een gekoppelde server
In het volgende voorbeeld worden rijen in een externe tabel ingevoegd. Het voorbeeld begint met het maken van een koppeling naar de externe gegevensbron met behulp van sp_addlinkedserver. De naam van de gekoppelde server, MyLinkServer, wordt vervolgens opgegeven als onderdeel van de naam van het vierdelige object in het formulier server.catalog.schema.object.
van toepassing op: SQL Server 2008 (10.0.x) en hoger.
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. Gegevens invoegen in een externe tabel met behulp van de functie OPENQUERY
In het volgende voorbeeld wordt een rij in een externe tabel ingevoegd door de functie OPENQUERY-rijset op te geven. De naam van de gekoppelde server die in het vorige voorbeeld is gemaakt, wordt in dit voorbeeld gebruikt.
van toepassing op: SQL Server 2008 (10.0.x) en hoger.
INSERT OPENQUERY (MyLinkServer, 
    'SELECT Name, GroupName 
     FROM AdventureWorks2022.HumanResources.Department')  
VALUES ('Environmental Impact', 'Engineering');  
GO  
O. Gegevens invoegen in een externe tabel met behulp van de functie OPENDATASOURCE
In het volgende voorbeeld wordt een rij in een externe tabel ingevoegd door de functie OPENDATASOURCE-rijset op te geven. Geef een geldige servernaam op voor de gegevensbron met behulp van de indeling server_name of server_name\instance_name.
van toepassing op: SQL Server 2008 (10.0.x) en hoger.
-- 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. Invoegen in een externe tabel die is gemaakt met PolyBase
Gegevens exporteren van SQL Server naar Hadoop of Azure Storage. Maak eerst een externe tabel die verwijst naar het doelbestand of de doelmap. Gebruik VERVOLGENS INSERT INTO om gegevens uit een lokale SQL Server-tabel te exporteren naar een externe gegevensbron. Met de instructie INSERT INTO wordt het doelbestand of de doelmap gemaakt als het niet bestaat en de resultaten van de SELECT-instructie worden geëxporteerd naar de opgegeven locatie in de opgegeven bestandsindeling. Zie Aan de slag met PolyBasevoor meer informatie.
Van toepassing op: 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;  
Gegevens bulksgewijs laden uit tabellen of gegevensbestanden
Voorbeelden in deze sectie laten twee methoden zien voor het bulksgewijs laden van gegevens in een tabel met behulp van de INSERT-instructie.
Q. Gegevens invoegen in een heap met minimale logboekregistratie
In het volgende voorbeeld wordt een nieuwe tabel (een heap) gemaakt en worden gegevens uit een andere tabel ingevoegd met minimale logboekregistratie. In het voorbeeld wordt ervan uitgegaan dat het herstelmodel van de AdventureWorks2022 database is ingesteld op VOLLEDIG. Om ervoor te zorgen dat minimale logboekregistratie wordt gebruikt, wordt het herstelmodel van de AdventureWorks2022 database ingesteld op BULK_LOGGED voordat rijen worden ingevoegd en opnieuw worden ingesteld op VOLLEDIG na insert INTO... SELECT-instructie. Daarnaast wordt de TABLOCK-hint opgegeven voor de doeltabel Sales.SalesHistory. Dit zorgt ervoor dat de instructie minimale ruimte in het transactielogboek gebruikt en efficiënt presteert.
-- 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. De functie OPENROWSET gebruiken met BULK om gegevens bulksgewijs in een tabel te laden
In het volgende voorbeeld worden rijen uit een gegevensbestand in een tabel ingevoegd door de functie OPENROWSET op te geven. De IGNORE_TRIGGERS tabelhint wordt opgegeven voor prestatieoptimalisatie. Zie Bulkgegevens importeren met BULK INSERT of OPENROWSET(BULK...) (SQL Server) voor meer voorbeelden.
van toepassing op: SQL Server 2008 (10.0.x) en hoger.
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 ;  
Het standaardgedrag van de queryoptimalisatie overschrijven met behulp van hints
Voorbeelden in deze sectie laten zien hoe u tabelhints gebruikt om tijdelijk het standaardgedrag van de queryoptimalisatie te overschrijven bij het verwerken van de INSERT-instructie.
Caution
Omdat de SQL Server-queryoptimalisatie doorgaans het beste uitvoeringsplan voor een query selecteert, raden we u aan om hints alleen te gebruiken als laatste redmiddel door ervaren ontwikkelaars en databasebeheerders.
S. De TABLOCK-hint gebruiken om een vergrendelingsmethode op te geven
In het volgende voorbeeld wordt aangegeven dat een exclusieve (X)-vergrendeling wordt uitgevoerd op de tabel Production.Location en wordt bewaard tot het einde van de INSERT-instructie.
Van toepassing op: SQL Server, SQL Database.
INSERT INTO Production.Location WITH (XLOCK)  
(Name, CostRate, Availability)  
VALUES ( N'Final Inventory', 15.00, 80.00);  
De resultaten van de INSERT-instructie vastleggen
Voorbeelden in deze sectie laten zien hoe u de OUTPUT-component gebruikt om informatie te retourneren van, of expressies op basis van, elke rij die wordt beïnvloed door een INSERT-instructie. Deze resultaten kunnen worden geretourneerd naar de verwerkingstoepassing voor gebruik in bijvoorbeeld bevestigingsberichten, archivering en andere toepassingsvereisten.
T. UITVOER gebruiken met een INSERT-instructie
In het volgende voorbeeld wordt een rij in de ScrapReason tabel ingevoegd en wordt de OUTPUT component gebruikt om de resultaten van de instructie te retourneren aan de @MyTableVar tabelvariabele. Omdat de ScrapReasonID kolom is gedefinieerd met een IDENTITY eigenschap, wordt er geen waarde opgegeven in de INSERT instructie voor die kolom. Houd er echter rekening mee dat de waarde die door de database-engine voor die kolom wordt gegenereerd, wordt geretourneerd in de OUTPUT component in de INSERTED.ScrapReasonID kolom.
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. UITVOER gebruiken met identiteits- en berekende kolommen
In het volgende voorbeeld wordt de EmployeeSales tabel gemaakt en vervolgens meerdere rijen erin ingevoegd met behulp van een INSERT-instructie met een SELECT-instructie om gegevens op te halen uit brontabellen. De EmployeeSales tabel bevat een identiteitskolom (EmployeeID) en een berekende kolom (ProjectedSales). Omdat deze waarden tijdens de invoegbewerking door de database-engine worden gegenereerd, kunnen geen van deze kolommen worden gedefinieerd in @MyTableVar.
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. Gegevens invoegen die worden geretourneerd vanuit een OUTPUT-component
In het volgende voorbeeld worden gegevens vastgelegd die worden geretourneerd uit de OUTPUT-component van een MERGE-instructie en worden die gegevens in een andere tabel ingevoegd. Met de instructie MERGE wordt de Quantity kolom van de ProductInventory tabel dagelijks bijgewerkt op basis van orders die in de SalesOrderDetail tabel in de Database AdventureWorks2022 worden verwerkt. Ook worden rijen verwijderd voor producten waarvan de voorraden dalen tot 0. In het voorbeeld worden de rijen vastgelegd die worden verwijderd en ingevoegd in een andere tabel, ZeroInventorywaarmee producten worden bijgehouden zonder inventaris.
--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. Gegevens invoegen met behulp van de select-optie
In het volgende voorbeeld ziet u hoe u meerdere rijen met gegevens invoegt met behulp van een INSERT-instructie met een SELECT-optie. De eerste INSERT instructie maakt rechtstreeks gebruik van een SELECT instructie om gegevens op te halen uit de brontabel en vervolgens om de resultatenset op te slaan in de EmployeeTitles tabel.
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. Een label opgeven met de INSERT-instructie
In het volgende voorbeeld ziet u het gebruik van een label met een INSERT-instructie.
-- Uses AdventureWorks  
  
INSERT INTO DimCurrency   
VALUES (500, N'C1', N'Currency1')  
OPTION ( LABEL = N'label1' );  
Y. Een label en een queryhint gebruiken met de INSERT-instructie
Deze query toont de basissyntaxis voor het gebruik van een label en een hint voor querydeelname met de insert-instructie. Nadat de query is verzonden naar het beheerknooppunt, past SQL Server, die wordt uitgevoerd op de rekenknooppunten, de hash-joinstrategie toe wanneer het sql Server-queryplan wordt gegenereerd. Zie OPTION (SQL Server PDW) voor meer informatie over hints voor joins en het gebruik van de OPTION-component.
-- 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);  
See Also
              BULK INSERT (Transact-SQL)
              DELETE (Transact-SQL)
              EXECUTE (Transact-SQL)
              FROM (Transact-SQL)
              IDENTITY (eigenschap) (Transact-SQL)
              NEWID (Transact-SQL)
              SELECT (Transact-SQL)
              UPDATE (Transact-SQL)
              MERGE (Transact-SQL)
              OUTPUT-component (Transact-SQL)
              De ingevoegde en verwijderde tabellen gebruiken