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
Voegt een of meer rijen toe aan een tabel of een weergave in SQL Server. Zie Voorbeelden voor voorbeelden.
Transact-SQL syntaxis-conventies
Tip
Microsoft Fabric Data Warehouse is een relationeel warehouse op ondernemingsniveau op data lake-basis, met een architectuur die klaar is voor de toekomst, ingebouwde AI en nieuwe functies. Als u nieuw bent in gegevensopslag, begin dan met Fabric Data Warehouse. Bestaande dediceerde SQL-poolworkloads kunnen upgraden naar Fabric voor toegang tot nieuwe mogelijkheden in data science, realtime analyses en rapportage.
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>
Specificeert de tijdelijke benoemde resultaatset, ook wel bekend als een gemeenschappelijke tabelexpressie, gedefinieerd binnen de scope 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 zijn bereik, worden gebruikt als tabelbron in een INSERT statement.
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. Bijvoorbeeld, een INSERT weergave in een multi-tabel weergave moet een column_list gebruiken die alleen kolommen uit één basistabel verwijst. Voor meer informatie over bijwerkbare weergaven, zie CREATE VIEW (Transact-SQL).
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.
MET ( <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 die doelwitten zijn van INSERT statements te specificeren, zal in een toekomstige versie van SQL Server worden verwijderd. Deze hints beïnvloeden de prestaties van INSERT statements niet. Vermijd het gebruik ervan in nieuwe ontwikkelwerkzaamheden en plan om toepassingen te wijzigen die deze momenteel gebruiken.
Het specificeren van de TABLOCK-hint op een tabel die het doelwit van een INSERT statement is, heeft hetzelfde effect als het specificeren 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 IDENTITY woning. 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 null-waarde. Er wordt een null-waarde gebruikt.
Is een berekende kolom. De berekende waarde wordt gebruikt.
column_list moet worden gebruikt wanneer expliciete waarden in een identiteitskolom worden ingevoegd, en de SET IDENTITY_INSERT optie moet AAN staan voor de tabel.
OUTPUT-clausule
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-clausule wordt niet ondersteund in DML-statements die verwijzen naar lokale gepartitioneerde views, distributed partitioned views, of remote tables, of INSERT statements die een execute_statement bevatten. De OUTPUT INTO-clausule wordt niet ondersteund in INSERT statements die een <dml_table_source> clausule 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.
Je kunt de Transact-SQL rijconstructor (ook wel een table value constructor genoemd) gebruiken om meerdere rijen in één statement INSERT te specificeren. 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 RESULT SETS-opties van de uitvoerbare instructie kunnen niet worden gespecificeerd in een INSERT... EXEC-verklaring.
Als execute_statement wordt gebruikt met INSERT, moet elke resultaatset 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.
Je kunt een tabel-waarde parameter niet specificeren als doel van een INSERT EXEC-instructie; deze kan echter wel als bron worden opgegeven in de INSERT EXEC-string of opgeslagen-procedure. Zie Table-Valued Parameters (Database Engine) gebruiken voor meer informatie.
<dml_table_source>
Specificeert dat de rijen die in de doeltabel worden ingevoegd, die zijn die zijn geretourneerd door de OUTPUT-clausule van een INSERT, UPDATE, DELETE, of MERGE statement, optioneel gefilterd door een WHERE-clausule. Als <dml_table_source> wordt gespecificeerd, moet het doel van de buitenste INSERT stelling aan de volgende voorwaarden voldoen:
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 getroffen rijen teruggeeft in een OUTPUT-clausule. De instructie kan geen WITH-component bevatten en kan geen externe tabellen of gepartitioneerde weergaven targeten. Als UPDATE of DELETE wordt gespecificeerd, kan het geen cursor-gebaseerd UPDATE of DELETE. Er kan niet naar bronrijen worden verwezen als geneste DML-instructies.
WAAR <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 WAARDEN
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.
OMVANG
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. Voor meer informatie, zie BULK INSERT (Transact-SQL).
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. Voor meer informatie, zie BULK INSERT (Transact-SQL).
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. Voor meer informatie, zie BULK INSERT (Transact-SQL).
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. Voor meer informatie, zie BULK INSERT (Transact-SQL).
Note
Er wordt een syntaxisfout gegenereerd als er geen kolomlijst wordt opgegeven.
Remarks
Voor informatie specifiek over het invoegen van data in SQL-grafiektabellen, zie INSERT (SQL Graph).
De MAXDOP-queryhint wordt niet ondersteund tijdens INSERT SELECT-operaties wanneer het SELECT-gedeelte van de instructie uit externe bronnen wordt gelezen.
Beste praktijken
Gebruik de @@ROWCOUNT -functie om het aantal ingevoegde rijen terug te geven aan de clientapplicatie. Voor meer informatie, zie @@ROWCOUNT (Transact-SQL).
Aanbevolen procedures voor het bulksgewijs importeren van gegevens
Met INTO INSERT ... SELECT om data in bulk te importeren met minimale logging en paralleliteit
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 statement, kunnen ook minimaal worden gelogd.
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 UIT gezet.
- 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.
Voor meer informatie over het gebruik INSERT op je Warehouse in Microsoft Fabric, zie Invoer data in je Warehouse met Transact-SQL.
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 OPENROWSET-functie kan de volgende tabelhints accepteren, die bulk-load optimalisaties 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.
Gegevenstypen
Houd rekening met het volgende gegevenstypegedrag wanneer u rijen invoegt:
Als een waarde wordt geladen in kolommen met een char, varchar of varbinair datatype, wordt het opvullen of afkappen van achterliggende lege plekken (ruimtes voor char en varchar, nullen voor varbinary) bepaald door de SET ANSI_PADDING instelling die voor de kolom werd gedefinieerd toen de tabel werd aangemaakt. Voor meer informatie, zie SET ANSI_PADDING (Transact-SQL).
De volgende tabel toont de standaardbewerking voor SET ANSI_PADDING UIT.
Gegevenstype Standaardwerking 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 typePointte maken en de waarde in de tabel in teCitiesvoegen.INSERT INTO Cities (Location) VALUES ( dbo.CreateNewPoint(x, y) );
Foutafhandeling
Je kunt foutbehandeling voor de instructie implementeren INSERT door de instructie te specificeren in een TRY... CATCH-constructie.
Als een INSERT statement een beperking of regel overtreedt, of als er een waarde is die niet compatibel is met het datatype van de kolom, faalt de instructie en wordt er een foutmelding teruggegeven.
Als INSERT meerdere rijen laadt met SELECT of EXECUTE, zorgt elke schending van een regel of constraint die plaatsvindt door de geladen waarden ervoor dat de instructie wordt gestopt en worden er geen rijen geladen.
Wanneer een INSERT statement een rekenfout tegenkomt (overflow, delen door nul, of een domeinfout) tijdens expressie-evaluatie, behandelt de Database Engine deze fouten alsof SET ARITHABORT ze op ON zijn gezet. De batch is gestopt en er wordt een foutbericht geretourneerd. Tijdens expressie-evaluatie wanneer SET ARITHABORT en SETSET ANSI_WARNINGS UIT zijn, als een INSERT, DELETE of UPDATE instructie een rekenfout, overflow, delen door nul of een domeinfout tegenkomt, voegt of werkt SQL Server een NULL-waarde in of bij. Als de doelkolom niet nullable is, mislukt de actie invoegen of bijwerken en ontvangt de gebruiker een fout.
Interoperability
Wanneer een INSTEAD OF trigger wordt gedefinieerd op INSERT acties tegen een tabel of weergave, voert de trigger uit in plaats van de instructie INSERT . Voor meer informatie over INSTEAD OF triggers, zie CREATE TRIGGER (Transact-SQL).
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 de verwezen rijen, zijn ze niet in enige volgorde gerangschikt en kan de ORDER BY-clausule niet direct in deze statements worden gespecificeerd. 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 queries die SELECT met ORDER BY gebruiken om rijen te vullen, garanderen hoe identiteitswaarden worden berekend, maar niet de volgorde waarin de rijen worden ingevoegd.
In Parallel Data Warehouse is de ORDER BY-clausule ongeldig in VIEWS, CREATE TABLE AS SELECT, INSERT SELECT, inline functies, afgeleide tabellen, subqueries en algemene tabelexpressies, tenzij TOP ook is gespecificeerd.
Logggedrag
De INSERT instructie wordt altijd volledig gelogd, behalve wanneer je de OPENROWSET-functie met het BULK-sleutelwoord gebruikt of wanneer INSERT INTO <target_table> SELECT <columns> FROM <source_table>je . 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. Voor meer informatie, zie "Security Considerations" in Import Bulk Data by Using BULK INSERT of OPENROWSET(BULK...) (SQL Server).
Permissions
INSERT Toestemming is vereist op de doel-tabel.
INSERTRechten worden standaard toegekend aan leden van de sysadmin vaste serverrol, de en db_datawriter de db_owner vaste databaserollen, en de tabel-eigenaar. Leden van de sysadmin, db_owneren de db_securityadmin rollen, en de eigenaar van de tabel kan machtigingen overdragen aan andere gebruikers.
Om uit te voeren INSERT met de OPENROWSET-functie BULK-optie, moet je lid zijn van de sysadmin vaste serverrol of van de bulkadmin vaste serverrol.
Examples
| Category | Aanbevolen syntaxiselementen |
|---|---|
| Basissyntaxis | INSERT * tabelwaardeconstructor |
| Kolomwaarden verwerken | IDENTITY * NEWID * standaardwaarden * door de gebruiker gedefinieerde types |
| Gegevens uit andere tabellen invoegen | INSERT... SELECTEER * INSERT... UITVOEREN * MET een gemeenschappelijke tabeluitdrukking * 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 | INSERT... SELECT * OPENROWSET-functie |
| Het standaardgedrag van de queryoptimalisatie overschrijven met behulp van hints | Tabelhints |
| Het vastleggen van de resultaten van de INSERT verklaring | OUTPUT-component |
Basissyntaxis
Voorbeelden in deze sectie tonen de basisfunctionaliteit van de INSERT statement met behulp van de minimaal vereiste syntaxis.
A. Eén rij met gegevens invoegen
Het volgende voorbeeld voegt één rij in in de Production.UnitMeasure tabel in de AdventureWorks2025-database. 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
Het volgende voorbeeld gebruikt de tabelwaardeconstructor om drie rijen in de tabel in de AdventureWorks2025-database in één enkele INSERT instructie in te Production.UnitMeasure 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 AdventureWorks2025-database is UnitMeasureCode, Name, ModifiedDate; maar de kolommen worden niet in die volgorde in column_list vermeld.
INSERT INTO Production.UnitMeasure (Name, UnitMeasureCode,
ModifiedDate)
VALUES (N'Square Yards', N'Y2', GETDATE());
Kolomwaarden verwerken
Voorbeelden in deze sectie tonen methoden om waarden in kolommen in te voegen die zijn gedefinieerd met een IDENTITY eigenschap, waarde, DEFAULT of zijn gedefinieerd met datatypen 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. De INSERT statements voegen rijen in die waarden bevatten voor sommige kolommen, maar niet voor alle. In de laatste INSERT instructie worden geen kolommen gespecificeerd en worden alleen de standaardwaarden ingevoegd door gebruik te maken van de DEFAULT VALUES-clausule.
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. De eerste twee INSERT statements maken het mogelijk om identiteitswaarden te genereren voor de nieuwe rijen. De derde INSERT instructie overschrijft de IDENTITY eigenschap voor de kolom met de SETSET IDENTITY_INSERT uitspraak 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
Het volgende voorbeeld laat zien hoe je gegevens uit de ene tabel in een andere tabel kunt invoegen met behulp van INSERT... SELECTEREN of INSERT... UITVOER. 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 gebruikt een SELECT-instructie om de gegevens af te leiden uit de brontabellen (Employee, SalesPerson, en Person) in de AdventureWorks2025-database en de resultaatset in de EmployeeSales tabel op te slaan. De tweede INSERT instructie gebruikt de uitvoeringsclausule om een opgeslagen procedure aan te roepen die de SELECT-instructie bevat, en de derde INSERT gebruikt de uitvoeringsclausule om de SELECT-instructie als letterlijke string te verwijzen.
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
Het volgende voorbeeld maakt de NewEmployee tabel aan in de AdventureWorks2025-database. Een algemene tabelexpressie (EmployeeTemp) definieert de rijen uit een of meer tabellen die in de NewEmployee tabel moeten worden ingevoegd. De INSERT verklaring verwijst naar de kolommen in de uitdrukking van de gemeenschappelijke tabel.
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
Het volgende voorbeeld maakt de tabel EmployeeSales aan en voegt de naam en de verkoopgegevens van het jaar tot nu toe in voor de top 5 willekeurige medewerkers uit de tabel HumanResources.Employee in de AdventureWorks2025-database. De INSERT verklaring kiest elke 5 rijen die door de SELECT verklaring worden teruggegeven. 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
Het volgende voorbeeld specificeert een tabelvariabele als het doelobject in de AdventureWorks2025-database.
-- 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 data te exporteren van een lokale SQL Server-tabel naar een externe databron. De INSERT INTO-instructie maakt het bestemmingsbestand of de map aan als deze niet bestaat en de resultaten van de SELECT-instructie worden geëxporteerd naar de opgegeven locatie in het opgegeven bestandsformaat. 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 tonen twee methoden om data in bulk in een tabel te laden met behulp van de INSERT stelling.
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 AdventureWorks2025 database is ingesteld op VOLLEDIG. Om minimale logging te garanderen, wordt het herstelmodel van de AdventureWorks2025 database ingesteld op BULK_LOGGED voordat rijen worden ingevoegd en na de 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. Voor meer voorbeelden, zie Import Bulk Data door gebruik te maken BULK INSERT of OPENROWSET(BULK...) (SQL Server).
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 tonen aan hoe je table hints kunt gebruiken om tijdelijk het standaardgedrag van de query-optimizer 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
Het volgende voorbeeld specificeert dat een exclusieve (X) lock wordt genomen op de Production.Location-tabel en wordt vastgehouden 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);
Het vastleggen van de resultaten van de INSERT verklaring
Voorbeelden in deze sectie tonen aan hoe je de OUTPUT Clause kunt gebruiken om informatie terug te geven van, of expressies gebaseerd op, elke rij die door een INSERT instructie wordt beïnvloed. Deze resultaten kunnen worden geretourneerd naar de verwerkingstoepassing voor gebruik in bijvoorbeeld bevestigingsberichten, archivering en andere toepassingsvereisten.
T. OUTPUT gebruiken met een INSERT statement
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
Het volgende voorbeeld maakt de EmployeeSales tabel aan en voegt vervolgens meerdere rijen in deze in met behulp van een INSERT instructie met een SELECT-instructie om gegevens uit brontabellen op te halen. 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
Het volgende voorbeeld vangt gegevens die worden teruggegeven uit de OUTPUT-clausule van een MERGE statement en voegt die gegevens in een andere tabel in. De MERGE verklaring werkt dagelijks de Quantity kolom van de ProductInventory tabel bij, op basis van bestellingen die in de SalesOrderDetail tabel in de AdventureWorks2025-database 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
Het volgende voorbeeld laat zien hoe je meerdere rijen data kunt invoegen met 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 specificeren met de INSERT verklaring
Het volgende voorbeeld toont het gebruik van een label met een INSERT statement.
-- Uses AdventureWorks
INSERT INTO DimCurrency
VALUES (500, N'C1', N'Currency1')
OPTION ( LABEL = N'label1' );
Y. Met een label en een queryhint in de INSERT stelling
Deze query toont de basissyntaxis voor het gebruik van een label en een query join hint 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);
Zie ook
BULK INSERT (Transact-SQL)
DELETE (Transact-SQL)
UITVOEREN (Transact-SQL)
VAN (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