INSERT (Transact-SQL)INSERT (Transact-SQL)

GILT FÜR: jaSQL Server (ab 2008) jaAzure SQL-DatenbankjaAzure SQL Data Warehouse jaParallel Data WarehouseAPPLIES TO: yesSQL Server (starting with 2008) yesAzure SQL Database yesAzure SQL Data Warehouse yesParallel Data Warehouse

Fügt einer Tabelle oder Sicht in SQL ServerSQL Server eine oder mehrere Zeilen hinzu.Adds one or more rows to a table or a view in SQL ServerSQL Server. Beispiele finden Sie unter Beispiele.For examples, see Examples.

Themenlinksymbol Transact-SQL-SyntaxkonventionenTopic link icon Transact-SQL Syntax Conventions

SyntaxSyntax

-- Syntax for SQL Server and Azure 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 ] . | schema_name . ]  
    [ table_name | 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 ]  
-- Syntax for Azure SQL Data Warehouse and Parallel Data Warehouse  

INSERT INTO [ database_name . [ schema_name ] . | schema_name . ] table_name   
    [ ( column_name [ ,...n ] ) ]  
    {   
      VALUES ( { NULL | expression } )  
      | SELECT <select_criteria>  
    }  
    [ OPTION ( <query_option> [ ,...n ] ) ]  
[;]  

ArgumenteArguments

WITH <common_table_expression>WITH <common_table_expression>
Gibt das (auch als allgemeiner Tabellenausdruck bezeichnete) temporäre benannte Resultset an, das innerhalb des Bereichs der INSERT-Anweisung definiert ist.Specifies the temporary named result set, also known as common table expression, defined within the scope of the INSERT statement. Das Resultset wird von einer SELECT-Anweisung abgeleitet.The result set is derived from a SELECT statement. Weitere Informationen finden Sie unter WITH common_table_expression (Transact-SQL).For more information, see WITH common_table_expression (Transact-SQL).

TOP (expression) [ PERCENT ]TOP (expression) [ PERCENT ]
Gibt die Anzahl oder den Prozentsatz willkürlicher Zeilen an, die eingefügt werden.Specifies the number or percent of random rows that will be inserted. expression kann eine Anzahl oder ein Prozentsatz der Zeilen sein.expression can be either a number or a percent of the rows. Weitere Informationen finden Sie unter TOP (Transact-SQL).For more information, see TOP (Transact-SQL).

INTOINTO
Ein optionales Schlüsselwort, das zwischen INSERT und der Zieltabelle verwendet werden kann.Is an optional keyword that can be used between INSERT and the target table.

server_nameserver_name
Gilt für: SQL Server 2008SQL Server 2008 bis SQL Server 2017SQL Server 2017.Applies to: SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017.

Der Name des Verbindungsservers, auf dem sich die Tabelle oder Sicht befinden.Is the name of the linked server on which the table or view is located. Für server_name kann der Name eines Verbindungsservers angegeben werden, oder Sie verwenden die Funktion OPENDATASOURCE.server_name can be specified as a linked server name, or by using the OPENDATASOURCE function.

Wenn server_name als Verbindungsserver angegeben ist, sind database_name und schema_name erforderlich.When server_name is specified as a linked server, database_name and schema_name are required. Wenn server_name mit OPENDATASOURCE angegeben wird, gelten database_name und schema_name möglicherweise nicht für alle Datenquellen und unterliegen den Funktionen des OLE DB-Anbieters, der auf das Remoteobjekt zugreift.When server_name is specified with OPENDATASOURCE, database_name and schema_name may not apply to all data sources and is subject to the capabilities of the OLE DB provider that accesses the remote object.

database_namedatabase_name
Gilt für: SQL Server 2008SQL Server 2008 bis SQL Server 2017SQL Server 2017.Applies to: SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017.

Der Name der Datenbank.Is the name of the database.

schema_nameschema_name
Der Name des Schemas, zu dem die Tabelle oder Sicht gehört.Is the name of the schema to which the table or view belongs.

table_or_view_nametable_or view_name
Der Name der Tabelle oder Sicht, die die Daten empfangen soll.Is the name of the table or view that is to receive the data.

Innerhalb ihres Bereichs kann eine table-Variable als Tabellenquelle in einer INSERT-Anweisung verwendet werden.A table variable, within its scope, can be used as a table source in an INSERT statement.

Die Sicht, auf die table_or_view_name verweist, muss aktualisierbar sein und auf genau eine Basistabelle in der FROM-Klausel der Sicht verweisen.The view referenced by table_or_view_name must be updatable and reference exactly one base table in the FROM clause of the view. Beispielsweise muss eine INSERT-Anweisung für eine auf mehreren Tabellen basierende Sicht eine column_list verwenden, die nur auf Spalten einer einzigen Basistabelle verweist.For example, an INSERT into a multi-table view must use a column_list that references only columns from one base table. Weitere Informationen zu aktualisierbaren Sichten finden Sie unter CREATE VIEW (Transact-SQL).For more information about updatable views, see CREATE VIEW (Transact-SQL).

rowset_function_limitedrowset_function_limited
Gilt für: SQL Server 2008SQL Server 2008 bis SQL Server 2017SQL Server 2017.Applies to: SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017.

Die OPENQUERY-Funktion oder die OPENROWSET-Funktion.Is either the OPENQUERY or OPENROWSET function. Die Verwendung dieser Funktionen unterliegt den Funktionen des OLE DB-Anbieters, der auf das Remoteobjekt zugreift.Use of these functions is subject to the capabilities of the OLE DB provider that accesses the remote object.

WITH ( <table_hint_limited> [... n ] )WITH ( <table_hint_limited> [... n ] )
Gibt mindestens einen Tabellenhinweis an, der für eine Zieltabelle zulässig ist.Specifies one or more table hints that are allowed for a target table. Das WITH-Schlüsselwort und die Klammern sind erforderlich.The WITH keyword and the parentheses are required.

READPAST, NOLOCK und READUNCOMMITTED sind nicht zulässig.READPAST, NOLOCK, and READUNCOMMITTED are not allowed. Weitere Informationen zu Tabellenhinweisen finden Sie unter Tabellenhinweise (Transact-SQL).For more information about table hints, see Table Hints (Transact-SQL).

Wichtig

Die Möglichkeit, die Hinweise HOLDLOCK, SERIALIZABLE, READCOMMITTED, REPEATABLEREAD oder UPDLOCK für Tabellen anzugeben, bei denen es sich um Ziele von INSERT-Anweisungen handelt, wird in einer zukünftigen Version von SQL ServerSQL Server entfernt.The ability to specify the HOLDLOCK, SERIALIZABLE, READCOMMITTED, REPEATABLEREAD, or UPDLOCK hints on tables that are targets of INSERT statements will be removed in a future version of SQL ServerSQL Server. Diese Hinweise beeinträchtigen die Leistung von INSERT-Anweisungen nicht.These hints do not affect the performance of INSERT statements. Vermeiden Sie ihre Verwendung bei neuen Entwicklungsarbeiten, und planen Sie die Änderung von Anwendungen, in denen sie aktuell verwendet werden.Avoid using them in new development work, and plan to modify applications that currently use them.

Das Angeben eines TABLOCK-Hinweises für eine Tabelle, die das Ziel einer INSERT-Anweisung ist, hat dieselbe Wirkung wie das Angeben eines TABLOCKX-Hinweises.Specifying the TABLOCK hint on a table that is the target of an INSERT statement has the same effect as specifying the TABLOCKX hint. Auf die Tabelle wird eine exklusive Sperre angewendet.An exclusive lock is taken on the table.

(column_list)(column_list)
Eine Liste mit einer oder mehreren Spalten, in die Daten eingefügt werden sollen.Is a list of one or more columns in which to insert data. column_list muss in Klammern eingeschlossen und durch ein Trennzeichen getrennt werden.column_list must be enclosed in parentheses and delimited by commas.

Ist eine Spalte nicht in column_list enthalten, muss Datenbank-EngineDatabase Engine in der Lage sein, basierend auf der Spaltendefinition einen Wert bereitzustellen. Andernfalls kann die Zeile nicht geladen werden.If a column is not in column_list, the Datenbank-EngineDatabase Engine must be able to provide a value based on the definition of the column; otherwise, the row cannot be loaded. Datenbank-EngineDatabase Engine stellt automatisch einen Wert für die Spalte bereit, wenn für sie eine der folgenden Bedingungen erfüllt ist:The Datenbank-EngineDatabase Engine automatically provides a value for the column if the column:

  • Besitzt eine IDENTITY-Eigenschaft.Has an IDENTITY property. Der nächste inkrementelle Identitätswert wird verwendet.The next incremental identity value is used.

  • Verfügt über einen Standardwert.Has a default. Der Standardwert der Spalte wird verwendet.The default value for the column is used.

  • Verfügt über einen timestamp-Datentyp.Has a timestamp data type. Der aktuelle Zeitstempelwert wird verwendet.The current timestamp value is used.

  • Lässt NULL-Werte zu.Is nullable. Ein NULL-Wert wird verwendet.A null value is used.

  • Ist eine berechnete Spalte.Is a computed column. Der berechnete Wert wird verwendet.The calculated value is used.

column_list muss beim Einfügen von expliziten Werten in eine Identitätsspalte verwendet werden. Dabei muss die Option SET IDENTITY_INSERT für die Tabelle auf ON festgelegt sein.column_list must be used when explicit values are inserted into an identity column, and the SET IDENTITY_INSERT option must be ON for the table.

OUTPUT-KlauselOUTPUT Clause
Gibt eingefügte Zeilen als Teil des Einfügevorgangs zurück.Returns inserted rows as part of the insert operation. Die Ergebnisse können an die Verarbeitungsanwendung zurückgegeben bzw. zur weiteren Verarbeitung in eine Tabelle oder eine Tabellenvariable eingefügt werden.The results can be returned to the processing application or inserted into a table or table variable for further processing.

Die OUTPUT-Klausel wird in DML-Anweisungen, die auf lokale partitionierte Sichten, verteilte partitionierte Sichten oder Remotetabellen verweisen, oder INSERT-Anweisungen, die execute_statement enthalten, nicht unterstützt.The OUTPUT clause is not supported in DML statements that reference local partitioned views, distributed partitioned views, or remote tables, or INSERT statements that contain an execute_statement. Die OUTPUT INTO-Klausel wird nicht in INSERT-Anweisungen unterstützt, die eine <dml_table_source>-Klausel enthalten.The OUTPUT INTO clause is not supported in INSERT statements that contain a <dml_table_source> clause.

VALUESVALUES
Steht vor der Liste oder den Listen der Datenwerte, die eingefügt werden sollen.Introduces the list or lists of data values to be inserted. Für jede Spalte in column_list (falls angegeben) bzw. in der Tabelle muss ein Datenwert vorhanden sein.There must be one data value for each column in column_list, if specified, or in the table. Die Wertliste muss in Klammern stehen.The value list must be enclosed in parentheses.

Wenn die Reihenfolge der Werte in der Werteliste nicht mit der Reihenfolge der Spalten in der Tabelle übereinstimmt oder wenn nicht für jede Spalte in der Tabelle ein Wert vorhanden ist, muss mithilfe von column_list explizit die Spalte angegeben werden, in der ein eingehender Wert gespeichert werden soll.If the values in the Value list are not in the same order as the columns in the table or do not have a value for each column in the table, column_list must be used to explicitly specify the column that stores each incoming value.

Mit dem Transact-SQLTransact-SQL-Zeilenkonstruktor (auch Tabellenwertkonstruktor genannt) können mehrere Zeilen in einer einzelnen INSERT-Anweisung angegeben werden.You can use the Transact-SQLTransact-SQL row constructor (also called a table value constructor) to specify multiple rows in a single INSERT statement. Der Zeilenkonstruktor besteht aus einer einzelnen VALUES-Klausel mit mehreren Wertelisten, die in Klammern eingeschlossen und durch ein Komma getrennt sind.The row constructor consists of a single VALUES clause with multiple value lists enclosed in parentheses and separated by a comma. Weitere Informationen finden Sie unter Tabellenwertkonstruktor (Transact-SQL).For more information, see Table Value Constructor (Transact-SQL).

DEFAULTDEFAULT
Erzwingt, dass Datenbank-EngineDatabase Engine den für eine Spalte definierten Standardwert lädt.Forces the Datenbank-EngineDatabase Engine to load the default value defined for a column. Wenn für die Spalte kein Standardwert vorhanden ist und die Spalte NULL-Werte zulässt, wird NULL eingefügt.If a default does not exist for the column and the column allows null values, NULL is inserted. Für eine Spalte, die mit dem Datentyp timestamp definiert ist, wird der nächste Zeitstempelwert eingefügt.For a column defined with the timestamp data type, the next timestamp value is inserted. DEFAULT ist für eine Identitätsspalte nicht zulässig.DEFAULT is not valid for an identity column.

expressionexpression
Eine Konstante, eine Variable oder ein Ausdruck.Is a constant, a variable, or an expression. Der Ausdruck darf keine EXECUTE-Anweisung enthalten.The expression cannot contain an EXECUTE statement.

In Verweisen auf die Zeichendatentypen in Unicode nchar, nvarchar und ntext muss expression der Großbuchstabe „N“ vorangestellt werden.When referencing the Unicode character data types nchar, nvarchar, and ntext, 'expression' should be prefixed with the capital letter 'N'. Wenn "N" nicht angegeben wird, konvertiert SQL ServerSQL Server die Zeichenfolge in die Codepage, die der Standardsortierung der Datenbank oder Spalte entspricht.If 'N' is not specified, SQL ServerSQL Server converts the string to the code page that corresponds to the default collation of the database or column. Alle Zeichen, die in der betreffenden Codepage nicht gefunden werden, gehen verloren.Any characters not found in this code page are lost.

derived_tablederived_table
Eine gültige SELECT-Anweisung, die in die Tabelle zu ladende Datenzeilen zurückgibt.Is any valid SELECT statement that returns rows of data to be loaded into the table. Die SELECT-Anweisung kann keinen allgemeinen Tabellenausdruck (Common Table Expression, CTE) enthalten.The SELECT statement cannot contain a common table expression (CTE).

execute_statementexecute_statement
Eine gültige EXECUTE-Anweisung, die Daten mithilfe von SELECT- oder READTEXT-Anweisungen zurückgibt.Is any valid EXECUTE statement that returns data with SELECT or READTEXT statements. Weitere Informationen finden Sie unter EXECUTE (Transact-SQL).For more information, see EXECUTE (Transact-SQL).

Die RESULT SETS-Optionen der EXECUTE-Anweisung können in einer INSERT…EXEC-Anweisung nicht angegeben werden.The RESULT SETS options of the EXECUTE statement cannot be specified in an INSERT...EXEC statement.

Wenn execute_statement mit INSERT verwendet wird, muss jedes Resultset mit den Spalten in der Tabelle oder in column_list kompatibel sein.If execute_statement is used with INSERT, each result set must be compatible with the columns in the table or in column_list.

execute_statement kann zum Ausführen gespeicherter Prozeduren auf dem gleichen Server oder auf einem Remoteserver verwendet werden.execute_statement can be used to execute stored procedures on the same server or a remote server. Die Prozedur auf dem Remoteserver wird ausgeführt, und die Resultsets werden an den lokalen Server gesendet. Anschließend werden sie in die Tabelle auf dem lokalen Server geladen.The procedure in the remote server is executed, and the result sets are returned to the local server and loaded into the table in the local server. In einer verteilten Transaktion kann execute_statement nicht für einen verknüpften Loopbackserver ausgeführt werden, wenn für die Verbindung mehrere aktive Resultsets (MARS) aktiviert ist.In a distributed transaction, execute_statement cannot be issued against a loopback linked server when the connection has multiple active result sets (MARS) enabled.

Wenn execute_statement Daten mit der READTEXT-Anweisung zurückgibt, kann jede READTEXT-Anweisung maximal 1 MB (1024 KB) an Daten zurückgeben.If execute_statement returns data with the READTEXT statement, each READTEXT statement can return a maximum of 1 MB (1024 KB) of data. execute_statement kann auch mit erweiterten Prozeduren verwendet werden.execute_statement can also be used with extended procedures. execute_statement fügt die durch den Hauptthread der erweiterten Prozedur zurückgegebenen Daten ein. Die Ausgabe von anderen Threads als dem Hauptthread wird hingegen nicht eingefügt.execute_statement inserts the data returned by the main thread of the extended procedure; however, output from threads other than the main thread are not inserted.

Sie können keinen Tabellenwertparameter als Ziel einer INSERT EXEC-Anweisung angeben; er kann jedoch als Quelle in der INSERT EXEC-Zeichenfolge oder der gespeicherten Prozedur angegeben werden.You cannot specify a table-valued parameter as the target of an INSERT EXEC statement; however, it can be specified as a source in the INSERT EXEC string or stored-procedure. Weitere Informationen finden Sie unter Use Table-Valued Parameters (Database Engine).For more information, see Use Table-Valued Parameters (Database Engine).

<dml_table_source><dml_table_source>
Gibt an, dass es sich bei den in die Zieltabelle eingefügten Zeilen um die von der OUTPUT-Klausel in der INSERT-, UPDATE-, DELETE- oder MERGE-Anweisung zurückgegebenen Zeilen handelt, die optional durch eine WHERE-Klausel gefiltert werden.Specifies that the rows inserted into the target table are those returned by the OUTPUT clause of an INSERT, UPDATE, DELETE, or MERGE statement, optionally filtered by a WHERE clause. Wenn <dml_table_source> angegeben ist, muss das Ziel der äußeren INSERT-Anweisung die folgenden Einschränkungen einhalten:If <dml_table_source> is specified, the target of the outer INSERT statement must meet the following restrictions:

  • Die Tabelle muss eine Basistabelle sein, keine Sicht.It must be a base table, not a view.

  • Die Tabelle darf keine Remotetabelle sein.It cannot be a remote table.

  • Die Tabelle darf keine Definition von aktivierten Triggern besitzen.It cannot have any triggers defined on it.

  • Die Tabelle darf an keinen Primär-/Fremdschlüsselbeziehungen teilnehmen.It cannot participate in any primary key-foreign key relationships.

  • Sie darf nicht an Mergereplikationen oder aktualisierbaren Abonnements für Transaktionsreplikationen teilnehmen.It cannot participate in merge replication or updatable subscriptions for transactional replication.

Der Kompatibilitätsgrad der Datenbank muss auf 100 oder höher festgelegt sein.The compatibility level of the database must be set to 100 or higher. Weitere Informationen finden Sie unter OUTPUT-Klausel (Transact-SQL).For more information, see OUTPUT Clause (Transact-SQL).

<select_list><select_list>
Eine durch Trennzeichen getrennte Liste, die angibt, welche von der OUTPUT-Klausel zurückgegebenen Spalten eingefügt werden sollen.Is a comma-separated list specifying which columns returned by the OUTPUT clause to insert. Die Spalten in <select_list> müssen mit den Spalten kompatibel sein, in die Werte eingefügt werden.The columns in <select_list> must be compatible with the columns into which values are being inserted. <select_list> kann nicht auf Aggregatfunktionen oder TEXTPTR verweisen.<select_list> cannot reference aggregate functions or TEXTPTR.

Hinweis

In der SELECT-Liste aufgeführte Variablen verweisen auf ihre ursprünglichen Werte, unabhängig von den Änderungen, die daran in <dml_statement_with_output_clause> vorgenommen wurden.Any variables listed in the SELECT list refer to their original values, regardless of any changes made to them in <dml_statement_with_output_clause>.

<dml_statement_with_output_clause><dml_statement_with_output_clause>
Eine gültige INSERT-, UPDATE-, DELETE- oder MERGE-Anweisung, die betroffene Zeilen in einer OUTPUT-Klausel zurückgibt.Is a valid INSERT, UPDATE, DELETE, or MERGE statement that returns affected rows in an OUTPUT clause. Die Anweisung darf keine WITH-Klausel enthalten und sich nicht auf Remotetabellen oder partitionierte Sichten beziehen.The statement cannot contain a WITH clause, and cannot target remote tables or partitioned views. Wenn UPDATE oder DELETE angegeben wird, darf kein cursorbasiertes UPDATE oder DELETE verwendet werden.If UPDATE or DELETE is specified, it cannot be a cursor-based UPDATE or DELETE. Auf Quellzeilen darf nicht als geschachtelte DML-Anweisungen verwiesen werden.Source rows cannot be referenced as nested DML statements.

WHERE <search_condition>WHERE <search_condition>
WHERE-Klausel mit gültiger <search_condition>, die die von <dml_statement_with_output_clause> zurückgegebenen Zeilen filtert.Is any WHERE clause containing a valid <search_condition> that filters the rows returned by <dml_statement_with_output_clause>. Weitere Informationen finden Sie unter Suchbedingung (Transact-SQL).For more information, see Search Condition (Transact-SQL). Bei Verwendung in diesem Kontext darf <search_condition> keine Unterabfragen und benutzerdefinierte Skalarfunktionen für einen Datenzugriff, Aggregatfunktionen, TEXTPTR oder Prädikate der Volltextsuche enthalten.When used in this context, <search_condition> cannot contain subqueries, scalar user-defined functions that perform data access, aggregate functions, TEXTPTR, or full-text search predicates.

DEFAULT VALUESDEFAULT VALUES
Gilt für: SQL Server 2008SQL Server 2008 bis SQL Server 2017SQL Server 2017.Applies to: SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017.

Erzwingt, dass die neue Zeile den für jede Spalte definierten Standardwert enthält.Forces the new row to contain the default values defined for each column.

BULKBULK
Gilt für: SQL Server 2008SQL Server 2008 bis SQL Server 2017SQL Server 2017.Applies to: SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017.

Wird von externen Tools verwendet, um einen Binärdatenstrom hochzuladen.Used by external tools to upload a binary data stream. Diese Option ist nicht zur Verwendung mit Tools wie SQL Server Management StudioSQL Server Management Studio, SQLCMD, OSQL oder Anwendungsprogrammierschnittstellen für den Datenzugriff wie den nativen SQL ServerSQL Server-Client bestimmt.This option is not intended for use with tools such as SQL Server Management StudioSQL Server Management Studio, SQLCMD, OSQL, or data access application programming interfaces such as SQL ServerSQL Server Native Client.

FIRE_TRIGGERSFIRE_TRIGGERS
Gilt für: SQL Server 2008SQL Server 2008 bis SQL Server 2017SQL Server 2017.Applies to: SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017.

Gibt an, dass INSERT-Trigger, die für die Zieltabelle definiert sind, während des Binärdatenstrom-Uploads ausgeführt werden.Specifies that any insert triggers defined on the destination table execute during the binary data stream upload operation. Weitere Informationen finden Sie unter BULK INSERT (Transact-SQL).For more information, see BULK INSERT (Transact-SQL).

CHECK_CONSTRAINTSCHECK_CONSTRAINTS
Gilt für: SQL Server 2008SQL Server 2008 bis SQL Server 2017SQL Server 2017.Applies to: SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017.

Gibt an, dass alle Einschränkungen, die für die Zieltabelle oder -sicht gelten, während des Binärdatenstrom-Uploads überprüft werden müssen.Specifies that all constraints on the target table or view must be checked during the binary data stream upload operation. Weitere Informationen finden Sie unter BULK INSERT (Transact-SQL).For more information, see BULK INSERT (Transact-SQL).

KEEPNULLSKEEPNULLS
Gilt für: SQL Server 2008SQL Server 2008 bis SQL Server 2017SQL Server 2017.Applies to: SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017.

Gibt an, dass leere Spalten während des Binärdatenstrom-Uploads einen NULL-Wert beibehalten sollen.Specifies that empty columns should retain a null value during the binary data stream upload operation. Weitere Informationen finden Sie unter Beibehalten von NULL-Werten oder Verwenden von Standardwerten während des Massenimports (SQL Server).For more information, see Keep Nulls or Use Default Values During Bulk Import (SQL Server).

KILOBYTES_PER_BATCH = kilobytes_per_batchKILOBYTES_PER_BATCH = kilobytes_per_batch
Gibt die ungefähre Datenmenge pro Batch in KB als kilobytes_per_batch an.Specifies the approximate number of kilobytes (KB) of data per batch as kilobytes_per_batch. Weitere Informationen finden Sie unter BULK INSERT (Transact-SQL).For more information, see BULK INSERT (Transact-SQL).

ROWS_PER_BATCH =rows_per_batchROWS_PER_BATCH =rows_per_batch
Gilt für: SQL Server 2008SQL Server 2008 bis SQL Server 2017SQL Server 2017.Applies to: SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017.

Gibt die ungefähre Anzahl von Datenzeilen im Binärdatenstrom an.Indicates the approximate number of rows of data in the binary data stream. Weitere Informationen finden Sie unter BULK INSERT (Transact-SQL).For more information, see BULK INSERT (Transact-SQL).

Hinweis

Ein Syntaxfehler wird ausgelöst, wenn keine Spaltenliste bereitgestellt wird.A syntax error is raised if a column list is not provided.

RemarksRemarks

Spezifische Informationen zum Einfügen von Daten in SQL-Graph-Tabellen finden Sie unter INSERT (SQL-Graph).For information specific to inserting data into SQL graph tables, see INSERT (SQL Graph).

Bewährte MethodenBest Practices

Verwenden Sie die Funktion @@ROWCOUNT, um die Anzahl der eingefügten Zeilen an die Clientanwendung zurückzugeben.Use the @@ROWCOUNT function to return the number of inserted rows to the client application. Weitere Informationen finden Sie unter @@ROWCOUNT (Transact-SQL).For more information, see @@ROWCOUNT (Transact-SQL).

Bewährte Methoden für den Massenimport von DatenBest Practices for Bulk Importing Data

Verwenden von INSERT INTO…SELECT für den Massenimport von Daten mit minimaler ProtokollierungUsing INSERT INTO...SELECT to Bulk Import Data with Minimal Logging

Sie können INSERT INTO <target_table> SELECT <columns> FROM <source_table> verwenden, um eine große Anzahl von Zeilen aus einer Tabelle, z.B. einer Stagingtabelle, effizient in eine andere Tabelle mit minimaler Protokollierung zu übertragen.You can use INSERT INTO <target_table> SELECT <columns> FROM <source_table> to efficiently transfer a large number of rows from one table, such as a staging table, to another table with minimal logging. Die minimale Protokollierung kann die Leistung der Anweisung verbessern und die Wahrscheinlichkeit senken, dass der Vorgang den verfügbaren Transaktionsprotokoll-Speicherplatz während der Transaktion auffüllt.Minimal logging can improve the performance of the statement and reduce the possibility of the operation filling the available transaction log space during the transaction.

Bei der minimalen Protokollierung für diese Anweisung müssen die folgenden Voraussetzungen erfüllt sein:Minimal logging for this statement has the following requirements:

  • Das Wiederherstellungsmodell der Datenbank ist auf einfach oder massenprotokolliert festgelegt.The recovery model of the database is set to simple or bulk-logged.

  • Die Zieltabelle ist ein leerer oder nicht leerer Heap.The target table is an empty or nonempty heap.

  • Die Zieltabelle wird nicht in der Replikation verwendet.The target table is not used in replication.

  • Der TABLOCK-Hinweis wird für die Zieltabelle angegeben.The TABLOCK hint is specified for the target table.

Zeilen, die infolge einer Einfügeaktion in eine MERGE-Anweisung in einen Heap eingefügt werden, können ebenfalls minimal protokolliert werden.Rows that are inserted into a heap as the result of an insert action in a MERGE statement may also be minimally logged.

Im Gegensatz zur BULK INSERT-Anweisung, die eine weniger restriktive Massenupdatesperre enthält, weist INSERT INTO…SELECT mit dem TABLOCK-Hinweis eine exklusive Sperre (X) für die Tabelle auf.Unlike the BULK INSERT statement, which holds a less restrictive Bulk Update lock, INSERT INTO...SELECT with the TABLOCK hint holds an exclusive (X) lock on the table. Das bedeutet, dass Sie keine Zeilen mit parallelen Einfügevorgängen einfügen können.This means that you cannot insert rows using parallel insert operations.

Verwenden von OPENROWSET und BULK für den Massenimport von DatenUsing OPENROWSET and BULK to Bulk Import Data

Von der OPENROWSET-Funktion können die folgenden Tabellenhinweise akzeptiert werden, die Massenladeoptimierungen mit der INSERT-Anweisung bereitstellen:The OPENROWSET function can accept the following table hints, which provide bulk-load optimizations with the INSERT statement:

  • Der TABLOCK-Hinweis kann die Anzahl der Protokolldatensätze für den Einfügevorgang minimieren.The TABLOCK hint can minimize the number of log records for the insert operation. Das Wiederherstellungsmodell der Datenbank muss auf einfach oder massenprotokolliert festgelegt werden, und die Zieltabelle kann nicht in der Replikation verwendet werden.The recovery model of the database must be set to simple or bulk-logged and the target table cannot be used in replication. Weitere Informationen finden Sie unter Voraussetzungen für die minimale Protokollierung beim Massenimport.For more information, see Prerequisites for Minimal Logging in Bulk Import.

  • Durch den IGNORE_CONSTRAINTS-Hinweis kann vorübergehend die FOREIGN KEY- und CHECK-Einschränkungsüberprüfung deaktiviert werden.The IGNORE_CONSTRAINTS hint can temporarily disable FOREIGN KEY and CHECK constraint checking.

  • Durch den IGNORE_TRIGGERS-Hinweis kann vorübergehend die Ausführung des Triggers deaktiviert werden.The IGNORE_TRIGGERS hint can temporarily disable trigger execution.

  • Der KEEPDEFAULTS-Hinweis ermöglicht das Einfügen eines Standardwerts für eine Tabellenspalte (falls vorhanden) anstelle von NULL, wenn der Datensatz keinen Wert für die Spalte aufweist.The KEEPDEFAULTS hint allows the insertion of a table column's default value, if any, instead of NULL when the data record lacks a value for the column.

  • Der KEEPIDENTITY-Hinweis ermöglicht die Verwendung der Identitätswerte in der importierten Datendatei für die Identitätsspalte in der Zieltabelle.The KEEPIDENTITY hint allows the identity values in the imported data file to be used for the identity column in the target table.

Diese Optimierungen sind mit denen vergleichbar, die mit dem BULK INSERT-Befehl verfügbar sind.These optimizations are similar to those available with the BULK INSERT command. Weitere Informationen finden Sie unter Tabellenhinweise (Transact-SQL).For more information, see Table Hints (Transact-SQL).

DatentypenData Types

Beachten Sie beim Einfügen von Zeilen das folgende Datentypverhalten:When you insert rows, consider the following data type behavior:

  • Wird ein Wert in Spalten mit dem Datentyp char, varchar oder varbinary geladen, ist die Auffüllung mit Leerstellen oder das Abschneiden nachfolgender Leerstellen (Leerzeichen bei char und varchar, Nullen bei varbinary) abhängig von der Einstellung für SET ANSI_PADDING, die bei der Tabellenerstellung für die Spalte festgelegt wurde.If a value is being loaded into columns with a char, varchar, or varbinary data type, the padding or truncation of trailing blanks (spaces for char and varchar, zeros for varbinary) is determined by the SET ANSI_PADDING setting defined for the column when the table was created. Weitere Informationen finden Sie unter SET ANSI_PADDING (Transact-SQL).For more information, see SET ANSI_PADDING (Transact-SQL).

    Die folgende Tabelle zeigt den Standardvorgang für SET ANSI_PADDING OFF.The following table shows the default operation for SET ANSI_PADDING OFF.

    DatentypData type StandardvorgangDefault operation
    charchar Füllt den Wert mit Leerzeichen auf, bis die definierte Breite der Spalte erreicht ist.Pad value with spaces to the defined width of column.
    varcharvarchar Löscht nachfolgende Leerzeichen bis zum ersten Zeichen, das kein Leerzeichen ist, oder alle Zeichen bis auf eines, wenn die Zeichenfolge nur aus Leerzeichen besteht.Remove trailing spaces to the last non-space character or to a single-space character for strings made up of only spaces.
    varbinaryvarbinary Löscht nachfolgende Nullen.Remove trailing zeros.
  • Wird eine leere Zeichenfolge („ “) in eine Spalte mit dem Datentyp varchar oder text geladen, wird standardmäßig eine Zeichenfolge der Länge 0 (null) eingefügt.If an empty string (' ') is loaded into a column with a varchar or text data type, the default operation is to load a zero-length string.

  • Durch das Einfügen eines NULL-Werts in eine Spalte mit dem Datentyp text oder image wird kein gültiger Textzeiger erstellt, und es wird vorab auch keine 8-KB-Textseite zugeordnet.Inserting a null value into a text or image column does not create a valid text pointer, nor does it preallocate an 8-KB text page.

  • Mit dem Datentyp uniqueidentifier erstellte Spalten enthalten speziell formatierte 16-Byte-Binärwerte.Columns created with the uniqueidentifier data type store specially formatted 16-byte binary values. Anders als bei Identitätsspalten generiert Datenbank-EngineDatabase Engine für Spalten mit dem Datentyp uniqueidentifier nicht automatisch Werte.Unlike with identity columns, the Datenbank-EngineDatabase Engine does not automatically generate values for columns with the uniqueidentifier data type. Bei einem Einfügevorgang können Variablen mit einem uniqueidentifier-Datentyp und Zeichenfolgenkonstanten der Form xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx (36 Zeichen inklusive Bindestriche, wobei x für eine Hexadezimalziffer im Bereich 0–9 bzw. a–f steht) für uniqueidentifier-Spalten verwendet werden.During an insert operation, variables with a data type of uniqueidentifier and string constants in the form xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx (36 characters including hyphens, where x is a hexadecimal digit in the range 0-9 or a-f) can be used for uniqueidentifier columns. Der Wert 6F9619FF-8B86-D011-B42D-00C04FC964FF ist z.B. ein gültiger Wert für eine uniqueidentifier-Variable oder -Spalte.For example, 6F9619FF-8B86-D011-B42D-00C04FC964FF is a valid value for a uniqueidentifier variable or column. Verwenden Sie die Funktion NEWID(), um eine GUID (ein eindeutiger Bezeichner) abzurufen.Use the NEWID() function to obtain a globally unique ID (GUID).

Einfügen von Werten in Spalten eines benutzerdefinierten TypsInserting Values into User-Defined Type Columns

Sie können Werte in Spalten eines benutzerdefinierten Typs einfügen, indem Sie eine der folgenden Methoden verwenden:You can insert values in user-defined type columns by:

  • Bereitstellen eines Werts des benutzerdefinierten TypsSupplying a value of the user-defined type.

  • Bereitstellen eines Werts eines SQL ServerSQL Server-Systemdatentyps, sofern der benutzerdefinierte Typ implizite oder explizite Konvertierung von diesem Typ unterstützt.Supplying a value in a SQL ServerSQL Server system data type, as long as the user-defined type supports implicit or explicit conversion from that type. Im folgenden Beispiel wird gezeigt, wie ein Wert durch explizite Konvertierung von einer Zeichenfolge in eine Spalte des benutzerdefinierten Typs Point eingefügt wird.The following example shows how to insert a value in a column of user-defined type Point, by explicitly converting from a string.

    INSERT INTO Cities (Location)  
    VALUES ( CONVERT(Point, '12.3:46.2') );  
    

    Ein binärer Wert kann auch ohne explizite Konvertierung bereitgestellt werden, da alle benutzerdefinierten Typen implizit aus binären Werten konvertierbar sind.A binary value can also be supplied without performing explicit conversion, because all user-defined types are implicitly convertible from binary.

  • Aufrufen einer benutzerdefinierten Funktion, die einen Wert des benutzerdefinierten Typs zurückgibt.Calling a user-defined function that returns a value of the user-defined type. Das folgende Beispiel verwendet die benutzerdefinierte Funktion CreateNewPoint(), um einen neuen Wert des benutzerdefinierten Typs Point zu erstellen und den Wert in die Cities-Tabelle einzufügen.The following example uses a user-defined function CreateNewPoint() to create a new value of user-defined type Point and insert the value into the Cities table.

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

FehlerbehandlungError Handling

Sie können die Fehlerbehandlung für die INSERT-Anweisung durch Angeben der Anweisung in einem TRY…CATCH-Konstrukt implementieren.You can implement error handling for the INSERT statement by specifying the statement in a TRY...CATCH construct.

Wenn eine INSERT-Anweisung eine Einschränkung oder Regel verletzt bzw. die Anweisung einen Wert enthält, der mit dem Datentyp der Spalte nicht kompatibel ist, schlägt die Anweisung fehl, und eine Fehlermeldung wird zurückgegeben.If an INSERT statement violates a constraint or rule, or if it has a value incompatible with the data type of the column, the statement fails and an error message is returned.

Wenn INSERT mehrere Zeilen mit SELECT oder EXECUTE lädt, bewirkt eine Verletzung einer Regel oder Einschränkung beim Laden der Werte, dass die Anweisung beendet und keine Zeile geladen wird.If INSERT is loading multiple rows with SELECT or EXECUTE, any violation of a rule or constraint that occurs from the values being loaded causes the statement to be stopped, and no rows are loaded.

Wenn in einer INSERT-Anweisung bei der Auswertung eines Ausdrucks ein arithmetischer Fehler (Überlauf, Division durch Null oder Domänenfehler) auftritt, behandelt Datenbank-EngineDatabase Engine den Fehler so, als wäre SET ARITHABORT auf ON festgelegt.When an INSERT statement encounters an arithmetic error (overflow, divide by zero, or a domain error) occurring during expression evaluation, the Datenbank-EngineDatabase Engine handles these errors as if SET ARITHABORT is set to ON. Der Batch wird beendet, und eine Fehlermeldung wird zurückgegeben.The batch is stopped, and an error message is returned. Wenn in einer Anweisung INSERT, DELETE oder UPDATE ein arithmetischer Fehler (Überlauf, Division durch 0 (null) oder Bereichsfehler) bei der Auswertung eines Ausdrucks auftritt und SET ARITHABORT und SET ANSI_WARNINGS auf OFF festgelegt ist, fügt SQL ServerSQL Server einen NULL-Wert ein oder aktualisiert ihn.During expression evaluation when SET ARITHABORT and SET ANSI_WARNINGS are OFF, if an INSERT, DELETE or UPDATE statement encounters an arithmetic error, overflow, divide-by-zero, or a domain error, SQL ServerSQL Server inserts or updates a NULL value. Wenn die Zielspalte keine NULL-Werte zulässt, schlägt das Einfügen oder Aktualisieren fehl, und dem Benutzer wird ein Fehler angezeigt.If the target column is not nullable, the insert or update action fails and the user receives an error.

InteroperabilitätInteroperability

Wenn ein INSTEAD OF-Trigger für INSERT-Aktionen für eine Tabelle oder Sicht definiert ist, wird der Trigger anstelle der INSERT-Anweisung ausgeführt.When an INSTEAD OF trigger is defined on INSERT actions against a table or view, the trigger executes instead of the INSERT statement. Weitere Informationen zu INSTEAD OF-Triggern finden Sie unter CREATE TRIGGER (Transact-SQL).For more information about INSTEAD OF triggers, see CREATE TRIGGER (Transact-SQL).

EinschränkungenLimitations and Restrictions

Wenn in Remotetabellen Werte eingefügt und nicht alle Werte für alle Spalten angegeben werden, müssen Sie die Spalten identifizieren, in denen die angegebenen Werte eingefügt werden sollen.When you insert values into remote tables and not all values for all columns are specified, you must identify the columns to which the specified values are to be inserted.

Wenn TOP mit INSERT verwendet wird, werden die Zeilen, auf die verwiesen wird, nicht auf bestimmte Weise angeordnet, und die ORDER BY-Klausel kann in dieser Anweisung nicht direkt angegeben werden.When TOP is used with INSERT the referenced rows are not arranged in any order and the ORDER BY clause can not be directly specified in this statements. Wenn Sie die TOP-Klausel verwenden müssen, um Zeilen in einer sinnvollen Reihenfolge einzufügen, müssen Sie sie zusammen mit einer ORDER BY-Klausel in einer untergeordneten SELECT-Anweisung verwenden.If you need to use TOP to insert rows in a meaningful chronological order, you must use TOP together with an ORDER BY clause that is specified in a subselect statement. Weitere Informationen finden Sie im Abschnitt "Beispiele" in diesem Thema.See the Examples section that follows in this topic.

INSERT-Abfragen, die SELECT mit ORDER BY zum Füllen von Zeilen verwenden, stellen sicher, wie Identitätswerte berechnet werden, jedoch nicht in der Reihenfolge, in der die Zeilen eingefügt werden.INSERT queries that use SELECT with ORDER BY to populate rows guarantees how identity values are computed but not the order in which the rows are inserted.

In Parallel Data Warehouse ist die ORDER BY-Klausel in VIEWS, CREATE TABLE AS SELECT, INSERT SELECT, Inlinefunktionen, abgeleiteten Tabellen, Unterabfragen und allgemeinen Tabellenausdrücken nur dann gültig, wenn auch TOP angegeben wird.In Parallel Data Warehouse, the ORDER BY clause is invalid in VIEWS, CREATE TABLE AS SELECT, INSERT SELECT, inline functions, derived tables, subqueries and common table expressions, unless TOP is also specified.

ProtokollierungsverhaltenLogging Behavior

Die INSERT-Anweisung wird immer vollständig protokolliert, sofern nicht die OPENROWSET-Funktion mit dem BULK-Schlüsselwort oder INSERT INTO <target_table> SELECT <columns> FROM <source_table> verwendet wird.The INSERT statement is always fully logged except when using the OPENROWSET function with the BULK keyword or when using INSERT INTO <target_table> SELECT <columns> FROM <source_table>. Für diese Vorgänge ist eine minimale Protokollierung möglich.These operations can be minimally logged. Weitere Informationen finden Sie im Abschnitt "Bewährte Methoden zum Massenladen von Daten" weiter oben in diesem Thema.For more information, see the section "Best Practices for Bulk Loading Data" earlier in this topic.

SecuritySecurity

Im Verlauf der Verbindung mit einem Verbindungsserver stellt der sendende Server einen Benutzernamen und ein Kennwort bereit, um eine Verbindung mit dem empfangenden Server in dessen Auftrag aufzubauen.During a linked server connection, the sending server provides a login name and password to connect to the receiving server on its behalf. Damit diese Verbindung funktioniert, müssen Sie mithilfe von sp_addlinkedsrvlogin eine Anmeldenamenzuordnung zwischen den Verbindungsservern erstellen.For this connection to work, you must create a login mapping between the linked servers by using sp_addlinkedsrvlogin.

Für die Verwendung von OPENROWSET(BULK…) ist es wichtig, nachvollziehen zu können, wie in SQL ServerSQL Server mit Identitätswechseln umgegangen wird.When you use OPENROWSET(BULK...), it is important to understand how SQL ServerSQL Server handles impersonation. Weitere Informationen finden Sie im Abschnitt „Überlegungen zur Sicherheit“ unter Importieren von Massendaten mithilfe von BULK INSERT oder OPENROWSET(BULK...) (SQL Server).For more information, see "Security Considerations" in Import Bulk Data by Using BULK INSERT or OPENROWSET(BULK...) (SQL Server).

BerechtigungenPermissions

Die INSERT-Berechtigung ist für die Zieltabelle erforderlich.INSERT permission is required on the target table.

Mitglieder der festen Serverrolle sysadmin, der festen Datenbankrollen db_owner und db_datawriter und der Tabellenbesitzer erhalten standardmäßig INSERT-Berechtigungen.INSERT permissions default to members of the sysadmin fixed server role, the db_owner and db_datawriter fixed database roles, and the table owner. Mitglieder der Rollen sysadmin, db_owner und db_securityadmin sowie der Tabellenbesitzer können Berechtigungen an andere Benutzer übertragen.Members of the sysadmin, db_owner, and the db_securityadmin roles, and the table owner can transfer permissions to other users.

Zum Ausführen von INSERT mit der Option BULK der OPENROWSET-Funktion müssen Sie Mitglied der festen Serverrolle sysadmin oder der festen Serverrolle bulkadmin sein.To execute INSERT with the OPENROWSET function BULK option, you must be a member of the sysadmin fixed server role or of the bulkadmin fixed server role.

BeispieleExamples

KategorieCategory FunktionssyntaxelementeFeatured syntax elements
Grundlegende SyntaxBasic syntax INSERT • TabellenwertkonstruktorINSERT • table value constructor
Behandeln von SpaltenwertenHandling column values IDENTITY • NEWID • Standardwerte • Benutzerdefinierte TypenIDENTITY • NEWID • default values • user-defined types
Einfügen von Daten aus anderen TabellenInserting data from other tables INSERT…SELECT • INSERT…EXECUTE • WITH Allgemeiner Tabellenausdruck • TOP • OFFSET FETCHINSERT...SELECT • INSERT...EXECUTE • WITH common table expression • TOP • OFFSET FETCH
Angeben von Zielobjekten, die keine Standardtabellen sindSpecifying target objects other than standard tables Views • TabellenvariablenViews • table variables
Einfügen von Zeilen in eine RemotetabelleInserting rows into a remote table Verbindungsserver • OPENQUERY-Rowsetfunktion • OPENDATASOURCE-RowsetfunktionLinked server • OPENQUERY rowset function • OPENDATASOURCE rowset function
Massenladen von Daten aus Tabellen oder DatendateienBulk loading data from tables or data files INSERT…SELECT • OPENROWSET-FunktionINSERT...SELECT • OPENROWSET function
Überschreiben des Standardverhaltens des Abfrageoptimierers mithilfe von HinweisenOverriding the default behavior of the query optimizer by using hints TabellenhinweiseTable hints
Erfassen der Ergebnisse der INSERT-AnweisungCapturing the results of the INSERT statement OUTPUT-KlauselOUTPUT clause

Grundlegende SyntaxBasic Syntax

Anhand von Beispielen in diesem Abschnitt wird die grundlegende Funktion der INSERT-Anweisung mithilfe der mindestens erforderlichen Syntax veranschaulicht.Examples in this section demonstrate the basic functionality of the INSERT statement using the minimum required syntax.

A.A. Einfügen einer einzelnen DatenzeileInserting a single row of data

Im folgenden Beispiel wird eine Zeile in die Production.UnitMeasure-Tabelle der AdventureWorks2012AdventureWorks2012-Datenbank eingefügt.The following example inserts one row into the Production.UnitMeasure table in the AdventureWorks2012AdventureWorks2012 database. Die Spalten in dieser Tabelle heißen UnitMeasureCode, Name und ModifiedDate.The columns in this table are UnitMeasureCode, Name, and ModifiedDate. Da Werte für alle Spalten bereitgestellt werden und in der Reihenfolge der Spalten in der Tabelle aufgelistet sind, müssen die Spaltennamen nicht in der Spaltenliste angegeben werden .Because values for all columns are supplied and are listed in the same order as the columns in the table, the column names do not have to be specified in the column list .

INSERT INTO Production.UnitMeasure  
VALUES (N'FT', N'Feet', '20080414');  

B.B. Einfügen mehrerer DatenzeilenInserting multiple rows of data

Im folgenden Beispiel werden mit dem Tabellenwertkonstruktor in einer einzelnen INSERT-Anweisung drei Zeilen in die Tabelle Production.UnitMeasure der Datenbank AdventureWorks2012AdventureWorks2012 eingefügt.The following example uses the table value constructor to insert three rows into the Production.UnitMeasure table in the AdventureWorks2012AdventureWorks2012 database in a single INSERT statement. Da Werte für alle Spalten bereitgestellt werden und in der Reihenfolge der Spalten in der Tabelle aufgelistet sind, müssen die Spaltennamen nicht in der Spaltenliste angegeben werden.Because values for all columns are supplied and are listed in the same order as the columns in the table, the column names do not have to be specified in the column list.

INSERT INTO Production.UnitMeasure  
VALUES (N'FT2', N'Square Feet ', '20080923'), (N'Y', N'Yards', '20080923')
    , (N'Y3', N'Cubic Yards', '20080923');  

C.C. Einfügen von Daten, deren Reihenfolge nicht mit der Reihenfolge der Tabellenspalten übereinstimmtInserting data that is not in the same order as the table columns

Im folgenden Beispiel wird eine Spaltenliste verwendet, um die in jede Spalte einzufügenden Werte explizit anzugeben.The following example uses a column list to explicitly specify the values that are inserted into each column. Die Spaltenreihenfolge in der Tabelle Production.UnitMeasure der Datenbank AdventureWorks2012AdventureWorks2012 lautet UnitMeasureCode, Name, ModifiedDate. Die Spalten sind jedoch nicht in dieser Reihenfolge in column_list aufgelistet.The column order in the Production.UnitMeasure table in the AdventureWorks2012AdventureWorks2012 database is UnitMeasureCode, Name, ModifiedDate; however, the columns are not listed in that order in column_list.

INSERT INTO Production.UnitMeasure (Name, UnitMeasureCode,  
    ModifiedDate)  
VALUES (N'Square Yards', N'Y2', GETDATE());  

Behandeln von SpaltenwertenHandling Column Values

In den Beispielen in diesem Abschnitt werden Methoden zum Einfügen von Werten in Spalten erläutert, die mit einer IDENTITY-Eigenschaft und einem DEFAULT-Wert oder mit Datentypen wie uniqueidentifier oder Spalten eines benutzerdefinierten Typs definiert werden.Examples in this section demonstrate methods of inserting values into columns that are defined with an IDENTITY property, DEFAULT value, or are defined with data types such as uniqueidentifer or user-defined type columns.

D.D. Einfügen von Daten in eine Tabelle mit Spalten, die Standardwerte enthaltenInserting data into a table with columns that have default values

Im folgenden Beispiel wird das Einfügen von Zeilen in eine Tabelle mit Spalten gezeigt, die automatisch einen Wert generieren oder einen Standardwert haben.The following example shows inserting rows into a table with columns that automatically generate a value or have a default value. Column_1 ist eine berechnete Spalte, die automatisch einen Wert generiert, indem eine Zeichenfolge mit dem in column_2 eingefügten Wert verkettet wird.Column_1 is a computed column that automatically generates a value by concatenating a string with the value inserted into column_2. Column_2 wird als Standardeinschränkung definiert.Column_2 is defined with a default constraint. Wenn für diese Spalte kein Wert angegeben ist, wird der Standardwert verwendet.If a value is not specified for this column, the default value is used. Column_3 ist mit dem Datentyp rowversion definiert, der automatisch eine eindeutige, inkrementelle Binärzahl generiert.Column_3 is defined with the rowversion data type, which automatically generates a unique, incrementing binary number. Column_4 generiert nicht automatisch einen Wert.Column_4 does not automatically generate a value. Wird für diese Spalte kein Wert definiert, wird NULL eingefügt.When a value for this column is not specified, NULL is inserted. Die INSERT-Anweisungen fügen Zeilen ein, die Werte für einige (aber nicht alle) Spalten enthalten.The INSERT statements insert rows that contain values for some of the columns but not all. In der letzten INSERT-Anweisung werden keine Spalten angegeben, und nur die Standardwerte werden mithilfe der DEFAULT VALUES-Klausel eingefügt.In the last INSERT statement, no columns are specified and only the default values are inserted by using the DEFAULT VALUES clause.

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.E. Einfügen von Daten in eine Tabelle mit einer IdentitätsspalteInserting data into a table with an identity column

Im folgenden Beispiel werden verschiedene Methoden zum Einfügen von Daten in eine Identitätsspalte gezeigt.The following example shows different methods of inserting data into an identity column. Die ersten beiden INSERT-Anweisungen ermöglichen das Generieren von Identitätswerten für die neuen Zeilen.The first two INSERT statements allow identity values to be generated for the new rows. Die dritte INSERT-Anweisung überschreibt die IDENTITY-Eigenschaft für die Spalte mit der SET IDENTITY_INSERT-Anweisung und fügt in die Identitätsspalte einen expliziten Wert ein.The third INSERT statement overrides the IDENTITY property for the column with the SET IDENTITY_INSERT statement and inserts an explicit value into the identity column.

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.F. Einfügen von Daten in eine uniqueidentifier-Spalte mithilfe von NEWID()Inserting data into a uniqueidentifier column by using NEWID()

Im folgenden Beispiel wird die Funktion NEWID() verwendet, um eine GUID für column_2 zu erhalten.The following example uses the NEWID() function to obtain a GUID for column_2. Im Gegensatz zu Identitätsspalten generiert Datenbank-EngineDatabase Engine nicht automatisch Werte für Spalten mit dem uniqueidentifier-Datentyp, wie durch die zweite INSERT-Anweisung gezeigt.Unlike for identity columns, the Datenbank-EngineDatabase Engine does not automatically generate values for columns with the uniqueidentifier data type, as shown by the second INSERT statement.

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.G. Einfügen von Daten in Spalten eines benutzerdefinierten TypsInserting data into user-defined type columns

Mit den folgenden Transact-SQLTransact-SQL-Anweisungen werden drei Zeilen in die PointValue-Spalte der Points-Tabelle eingefügt.The following Transact-SQLTransact-SQL statements insert three rows into the PointValue column of the Points table. Für diese Spalte wird ein CLR-benutzerdefinierter Typ (UDT) verwendet.This column uses a CLR user-defined type (UDT). Der Point-Datentyp besteht aus X- und Y-Ganzzahlwerten, die als Eigenschaften des benutzerdefinierten Typs verfügbar gemacht werden.The Point data type consists of X and Y integer values that are exposed as properties of the UDT. Verwenden Sie entweder die CAST- oder CONVERT-Funktion, um die durch Kommas getrennten X- und Y-Werte in den Point-Typ umzuwandeln.You must use either the CAST or CONVERT function to cast the comma-delimited X and Y values to the Point type. Die ersten beiden Anweisungen verwenden die CONVERT-Funktion, um einen Zeichenfolgenwert in den Typ Point zu konvertieren. Die dritte Anweisung verwendet die CAST-Funktion.The first two statements use the CONVERT function to convert a string value to the Point type, and the third statement uses the CAST function. Weitere Informationen zum Ändern von Daten finden Sie unter Bearbeiten von UDT-Dateien.For more information, see Manipulating UDT Data.

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));  

Einfügen von Daten aus anderen TabellenInserting Data from Other Tables

Anhand von Beispielen in diesem Abschnitt werden Methoden zum Einfügen von Zeilen aus einer Tabelle in eine andere Tabelle gezeigt.Examples in this section demonstrate methods of inserting rows from one table into another table.

H.H. Verwenden der SELECT- und EXECUTE-Option zum Einfügen von Daten aus anderen TabellenUsing the SELECT and EXECUTE options to insert data from other tables

Im folgenden Beispiel wird gezeigt, wie Daten mithilfe von INSERT…SELECT oder INSERT…EXECUTE aus einer Tabelle in eine andere Tabelle eingefügt werden.The following example shows how to insert data from one table into another table by using INSERT...SELECT or INSERT...EXECUTE. Jede Methode basiert auf einer SELECT-Anweisung mit mehreren Tabellen, die einen Ausdruck und einen Literalwert in der Spaltenliste enthält.Each is based on a multi-table SELECT statement that includes an expression and a literal value in the column list.

Bei der ersten INSERT-Anweisung wird eine SELECT-Anweisung verwendet, um die Daten aus den Quelltabellen (Employee, SalesPerson und Person) in der Datenbank AdventureWorks2012AdventureWorks2012 abzuleiten und das Resultset in der Tabelle EmployeeSales zu speichern.The first INSERT statement uses a SELECT statement to derive the data from the source tables (Employee, SalesPerson, and Person) in the AdventureWorks2012AdventureWorks2012 database and store the result set in the EmployeeSales table. Für die zweite INSERT-Anweisung wird die EXECUTE-Klausel verwendet, um eine gespeicherte Prozedur aufzurufen, die die SELECT-Anweisung enthält, wohingegen für die dritte INSERT-Anweisung mithilfe der EXECUTE-Klausel auf die SELECT-Anweisung als Literalzeichenfolge verwiesen wird.The second INSERT statement uses the EXECUTE clause to call a stored procedure that contains the SELECT statement, and the third INSERT uses the EXECUTE clause to reference the SELECT statement as a literal string.

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.I. Definieren der eingefügten Daten mithilfe von WITH (allgemeiner Tabellenausdruck)Using WITH common table expression to define the data inserted

Im folgenden Beispiel wird die NewEmployee-Tabelle in der AdventureWorks2012AdventureWorks2012-Datenbank erstellt.The following example creates the NewEmployee table in the AdventureWorks2012AdventureWorks2012 database. Durch einen allgemeinen Tabellenausdruck (EmployeeTemp) werden die aus mindestens einer Tabelle in die NewEmployee-Tabelle einzufügenden Zeilen definiert.A common table expression (EmployeeTemp) defines the rows from one or more tables to be inserted into the NewEmployee table. Die INSERT-Anweisung verweist auf die Spalten im allgemeinen Tabellenausdruck.The INSERT statement references the columns in the common table expression.

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.J. Beschränken der aus der Quelltabelle eingefügten Daten mit TOPUsing TOP to limit the data inserted from the source table

Im folgenden Beispiel wird die EmployeeSales-Tabelle erstellt. Anschließend werden der Name und die Verkaufszahlen des laufenden Jahres für die ersten 5 zufälligen Mitarbeiter aus der HumanResources.Employee-Tabelle in der AdventureWorks2012AdventureWorks2012-Datenbank eingefügt.The following example creates the table EmployeeSales and inserts the name and year-to-date sales data for the top 5 random employees from the table HumanResources.Employee in the AdventureWorks2012AdventureWorks2012 database. Die INSERT-Anweisung wählt fünf beliebige Zeilen aus, die von der SELECT-Anweisung zurückgegeben werden.The INSERT statement chooses any 5 rows returned by the SELECT statement. Mit der OUTPUT-Klausel werden die Zeilen angezeigt, die in die EmployeeSales-Tabelle eingefügt werden.The OUTPUT clause displays the rows that are inserted into the EmployeeSales table. Beachten Sie, dass die ersten 5 Mitarbeiter in der SELECT-Anweisung nicht mit der ORDER BY-Klausel ermittelt werden.Notice that the ORDER BY clause in the SELECT statement is not used to determine the top 5 employees.

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;  

Wenn Sie die TOP-Klausel verwenden müssen, um Zeilen in einer sinnvollen Reihenfolge einzufügen, müssen Sie sie zusammen mit einer ORDER BY-Klausel in einer untergeordneten SELECT-Anweisung verwenden, wie im folgenden Beispiel veranschaulicht.If you have to use TOP to insert rows in a meaningful chronological order, you must use TOP together with ORDER BY in a subselect statement as shown in the following example. Mit der OUTPUT-Klausel werden die Zeilen angezeigt, die in die EmployeeSales-Tabelle eingefügt werden.The OUTPUT clause displays the rows that are inserted into the EmployeeSales table. Beachten Sie, dass die ersten 5 Mitarbeiter jetzt anhand der Ergebnisse der ORDER BY-Klausel und nicht anhand zufälliger Zeilen eingefügt werden.Notice that the top 5 employees are now inserted based on the results of the ORDER BY clause instead of random rows.

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;  

Angeben von Zielobjekten, die keine Standardtabellen sindSpecifying Target Objects Other Than Standard Tables

In den Beispielen in diesem Abschnitt wird veranschaulicht, wie Zeilen durch Angeben einer Sicht oder Tabellenvariablen eingefügt werden.Examples in this section demonstrate how to insert rows by specifying a view or table variable.

K.K. Einfügen von Daten durch Angeben einer SichtInserting data by specifying a view

Im folgenden Beispiel wird ein Sichtname als Zielobjekt angegeben. Die neue Zeile wird jedoch in die zugrunde liegende Basistabelle eingefügt.The following example specifies a view name as the target object; however, the new row is inserted in the underlying base table. Die Reihenfolge der Werte in der INSERT-Anweisung muss mit der Reihenfolge der Spalten in der Sicht übereinstimmen.The order of the values in the INSERT statement must match the column order of the view. Weitere Informationen finden Sie unter Modify Data Through a View (Ändern von Daten über eine Sicht).For more information, see Modify Data Through a View.

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.L. Einfügen von Daten in eine TabellevariableInserting data into a table variable

Im folgenden Beispiel wird eine Tabellenvariable als Zielobjekt in der AdventureWorks2012AdventureWorks2012-Datenbank angegeben.The following example specifies a table variable as the target object in the AdventureWorks2012AdventureWorks2012 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  

Einfügen von Zeilen in eine RemotetabelleInserting Rows into a Remote Table

In den Beispielen in diesem Abschnitt wird veranschaulicht, wie Zeilen mit einem Verbindungsserver oder einer Rowsetfunktion in eine Remotezieltabelle eingefügt werden, um auf die Remotetabelle zu verweisen.Examples in this section demonstrate how to insert rows into a remote target table by using a linked server or a rowset function to reference the remote table.

M.M. Einfügen von Daten in eine Remotetabelle mithilfe eines VerbindungsserversInserting data into a remote table by using a linked server

Im folgenden Beispiel werden Zeilen in eine Remotetabelle eingefügt.The following example inserts rows into a remote table. In diesem Beispiel wird zunächst mithilfe von sp_addlinkedserver ein Link zur Remotedatenquelle erstellt.The example begins by creating a link to the remote data source by using sp_addlinkedserver. Der Name des Verbindungsservers (MyLinkServer) wird anschließend als Teil des vierteiligen Objektnamens in der Form server.catalog.schema.object angegeben.The linked server name, MyLinkServer, is then specified as part of the four-part object name in the form server.catalog.schema.object.

Gilt für: SQL Server 2008SQL Server 2008 bis SQL Server 2017SQL Server 2017.Applies to: SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017.

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'AdventureWorks2012';  
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.AdventureWorks2012.HumanResources.Department (Name, GroupName)  
VALUES (N'Public Relations', N'Executive General and Administration');  
GO  

N.N. Einfügen von Daten in eine Remotetabelle mithilfe der OPENQUERY-FunktionInserting data into a remote table by using the OPENQUERY function

Im folgenden Beispiel wird durch Angabe der Rowsetfunktion OPENQUERY eine Zeile in eine Remotetabelle eingefügt.The following example inserts a row into a remote table by specifying the OPENQUERY rowset function. Der im vorherigen Beispiel erstellte Name des Verbindungsservers wird hier verwendet.The linked server name created in the previous example is used in this example.

Gilt für: SQL Server 2008SQL Server 2008 bis SQL Server 2017SQL Server 2017.Applies to: SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017.

INSERT OPENQUERY (MyLinkServer, 
    'SELECT Name, GroupName 
     FROM AdventureWorks2012.HumanResources.Department')  
VALUES ('Environmental Impact', 'Engineering');  
GO  

O.O. Einfügen von Daten in eine Remotetabelle mithilfe der OPENDATASOURCE-FunktionInserting data into a remote table by using the OPENDATASOURCE function

Im folgenden Beispiel wird durch Angabe der Rowsetfunktion OPENDATASOURCE eine Zeile in eine Remotetabelle eingefügt.The following example inserts a row into a remote table by specifying the OPENDATASOURCE rowset function. Geben Sie im Format server_name oder server_name\instance_name einen gültigen Servernamen für die Datenquelle an.Specify a valid server name for the data source by using the format server_name or server_name\instance_name.

Gilt für: SQL Server 2008SQL Server 2008 bis SQL Server 2017SQL Server 2017.Applies to: SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017.

-- 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')  
    .AdventureWorks2012.HumanResources.Department (Name, GroupName)  
    VALUES (N'Standards and Methods', 'Quality Assurance');  
GO  

P.P. Einfügen in eine externe Tabelle mithilfe von PolyBaseInserting into an external table created using PolyBase

Exportieren von Daten aus SQL Server in Hadoop oder Azure StorageExport data from SQL Server to Hadoop or Azure Storage. Erstellen Sie zuerst eine externe Tabelle, die auf die Zieldatei oder das Verzeichnis verweist.First, create an external table that points to the destination file or directory. Verwenden Sie dann INSERT INTO zum Exportieren von Daten aus einer lokalen SQL Server-Tabelle in eine externe Datenquelle.Then, use INSERT INTO to export data from a local SQL Server table to an external data source. Die INSERT INTO-Anweisung erstellt die Zieldatei oder das Verzeichnis, falls nicht vorhanden, und die Ergebnisse der SELECT-Anweisung werden zu einem angegebenen Speicherort im angegebenen Dateiformat exportiert.The INSERT INTO statement creates the destination file or directory if it does not exist and the results of the SELECT statement are exported to the specified location in the specified file format. Weitere Informationen finden Sie unter Get started with PolyBase(Erste Schritte mit PolyBase).For more information, see Get started with PolyBase.

Gilt für: SQL Server 2017SQL Server 2017.Applies to: SQL Server 2017SQL Server 2017.

-- 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;  

Massenladen von Daten aus Tabellen oder DatendateienBulk Loading Data from Tables or Data Files

In den Beispielen in diesem Abschnitt werden zwei Methoden zum Massenladen von Daten in eine Tabelle mithilfe der INSERT-Anweisung vorgestellt.Examples in this section demonstrate two methods to bulk load data into a table by using the INSERT statement.

Q.Q. Einfügen von Daten mit minimaler Protokollierung in einen HeapInserting data into a heap with minimal logging

Im folgenden Beispiel wird eine neue Tabelle (ein Heap) erstellt, und es werden Daten aus einer anderen Tabelle in die neu erstellte Tabelle eingefügt. Dazu wird minimale Protokollierung verwendet.The following example creates a new table (a heap) and inserts data from another table into it using minimal logging. Im Beispiel wird davon ausgegangen, dass das Wiederherstellungsmodell der AdventureWorks2012-Datenbank auf FULL festgelegt wird.The example assumes that the recovery model of the AdventureWorks2012 database is set to FULL. Zur Sicherstellung, dass die minimale Protokollierung verwendet wird, wird das Wiederherstellungsmodell der AdventureWorks2012-Datenbank auf BULK_LOGGED festgelegt, bevor Zeilen eingefügt und nach der INSERT INTO…-SELECT-Anweisung auf FULL zurückgesetzt werden.To ensure minimal logging is used, the recovery model of the AdventureWorks2012 database is set to BULK_LOGGED before rows are inserted and reset to FULL after the INSERT INTO...SELECT statement. Außerdem wird der TABLOCK-Hinweis für die Sales.SalesHistory-Zieltabelle angegeben.In addition, the TABLOCK hint is specified for the target table Sales.SalesHistory. Dadurch wird sichergestellt, dass die Anweisung minimalen Speicherplatz im Transaktionsprotokoll verwendet und effektiv ausgeführt wird.This ensures that the statement uses minimal space in the transaction log and performs efficiently.

-- 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 AdventureWorks2012  
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 AdventureWorks2012  
SET RECOVERY FULL;  
GO  

R.R. Verwenden der OPENROWSET-Funktion mit BULK zum Massenladen von Daten in eine TabelleUsing the OPENROWSET function with BULK to bulk load data into a table

Im folgenden Beispiel werden durch Angabe der OPENROWSET-Funktion Zeilen aus einer Datendatei in eine Tabelle eingefügt.The following example inserts rows from a data file into a table by specifying the OPENROWSET function. Der IGNORE_TRIGGERS-Tabellenhinweis wird zur Leistungsoptimierung angegeben.The IGNORE_TRIGGERS table hint is specified for performance optimization. Weitere Beispiele finden Sie unter Importieren von Massendaten mithilfe von BULK INSERT oder OPENROWSET(BULK...) (SQL Server).For more examples, see Import Bulk Data by Using BULK INSERT or OPENROWSET(BULK...) (SQL Server).

Gilt für: SQL Server 2008SQL Server 2008 bis SQL Server 2017SQL Server 2017.Applies to: SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017.

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 ;  

Überschreiben des Standardverhaltens des Abfrageoptimierers mithilfe von HinweisenOverriding the Default Behavior of the Query Optimizer by Using Hints

In den Beispielen in diesem Abschnitt wird gezeigt, wie mit Tabellenhinweisen beim Verarbeiten der INSERT-Anweisung zeitweise das Standardverhalten des Abfrageoptimierers überschrieben wird.Examples in this section demonstrate how to use table hints to temporarily override the default behavior of the query optimizer when processing the INSERT statement.

Achtung

Da der SQL ServerSQL Server-Abfrageoptimierer in der Regel den optimalen Ausführungsplan für eine Abfrage auswählt, wird empfohlen, dass erfahrene Entwickler und Datenbankadministratoren Hinweise nur dann verwenden, wenn alle anderen Möglichkeiten sich als unzureichend erwiesen haben.Because the SQL ServerSQL Server query optimizer typically selects the best execution plan for a query, we recommend that hints be used only as a last resort by experienced developers and database administrators.

S.S. Verwenden des TABLOCK-Hinweises zum Angeben einer SperrmethodeUsing the TABLOCK hint to specify a locking method

Im folgenden Beispiel wird angegeben, dass eine exklusive Sperre (X) für die Production.Location-Tabelle eingerichtet und bis zum Ende der INSERT-Anweisung aufrechterhalten wird.The following example specifies that an exclusive (X) lock is taken on the Production.Location table and is held until the end of the INSERT statement.

Gilt für: SQL ServerSQL Server, SQL-DatenbankSQL Database.Applies to: SQL ServerSQL Server, SQL-DatenbankSQL Database.

INSERT INTO Production.Location WITH (XLOCK)  
(Name, CostRate, Availability)  
VALUES ( N'Final Inventory', 15.00, 80.00);  

Erfassen der Ergebnisse der INSERT-AnweisungCapturing the Results of the INSERT Statement

In den Beispielen in diesem Abschnitt wird gezeigt, wie mit der OUTPUT-Klausel Informationen aus jeder von einer INSERT-Anweisung betroffenen Zeile bzw. Ausdrücke, die auf jeder Zeile basieren, zurückgegeben werden.Examples in this section demonstrate how to use the OUTPUT Clause to return information from, or expressions based on, each row affected by an INSERT statement. Diese Ergebnisse können an die verarbeitende Anwendung zurückgegeben werden, die sie z. B. für Bestätigungen, Archivierungen und andere Anwendungsanforderungen verwendet.These results can be returned to the processing application for use in such things as confirmation messages, archiving, and other such application requirements.

T.T. Verwenden von OUTPUT mit einer INSERT-AnweisungUsing OUTPUT with an INSERT statement

Im folgenden Beispiel wird eine Zeile in die ScrapReason-Tabelle eingefügt, und die OUTPUT-Klausel wird verwendet, um die Ergebnisse der Anweisung an die @MyTableVar-Tabellenvariable zurückzugeben.The following example inserts a row into the ScrapReason table and uses the OUTPUT clause to return the results of the statement to the @MyTableVar table variable. Da die ScrapReasonID-Spalte mit einer IDENTITY-Eigenschaft definiert ist, wird kein Wert für diese Spalte in der INSERT-Anweisung angegeben.Because the ScrapReasonID column is defined with an IDENTITY property, a value is not specified in the INSERT statement for that column. Beachten Sie jedoch, dass der von Datenbank-EngineDatabase Engine für diese Spalte generierte Wert in der OUTPUT-Klausel in der INSERTED.ScrapReasonID-Spalte zurückgegeben wird.However, note that the value generated by the Datenbank-EngineDatabase Engine for that column is returned in the OUTPUT clause in the INSERTED.ScrapReasonID column.

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.U. Verwenden von OUTPUT mit Identitätsspalten und berechneten SpaltenUsing OUTPUT with identity and computed columns

Im folgenden Beispiel wird die EmployeeSales-Tabelle erstellt, und es werden mehrere Zeilen mithilfe einer INSERT-Anweisung mit einer SELECT-Anweisung zum Abrufen der Daten aus den Quelltabellen in die Tabelle eingefügt.The following example creates the EmployeeSales table and then inserts several rows into it using an INSERT statement with a SELECT statement to retrieve data from source tables. Die EmployeeSales-Tabelle enthält eine Identitätsspalte (EmployeeID) und eine berechnete Spalte (ProjectedSales).The EmployeeSales table contains an identity column (EmployeeID) and a computed column (ProjectedSales). Da diese Werte während des Einfügevorgangs von Datenbank-EngineDatabase Engine generiert werden, kann keine dieser Spalten in @MyTableVar definiert werden.Because these values are generated by the Datenbank-EngineDatabase Engine during the insert operation, neither of these columns can be defined 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.V. Einfügen von Daten, die von einer OUTPUT-Klausel zurückgegeben wurdenInserting data returned from an OUTPUT clause

Im folgenden Beispiel werden aus der OUTPUT-Klausel einer MERGE-Anweisung zurückgegebene Daten erfasst und in eine andere Tabelle eingefügt.The following example captures data returned from the OUTPUT clause of a MERGE statement, and inserts that data into another table. Die MERGE-Anweisung aktualisiert die Quantity-Spalte der ProductInventory-Tabelle täglich auf der Grundlage der Bestellungen, die in der SalesOrderDetail-Tabelle der AdventureWorks2012AdventureWorks2012-Datenbank verarbeitet werden.The MERGE statement updates the Quantity column of the ProductInventory table daily, based on orders that are processed in the SalesOrderDetail table in the AdventureWorks2012AdventureWorks2012 database. Außerdem werden die Zeilen für Produkte gelöscht, deren Bestand auf 0 (null) fällt.It also deletes rows for products whose inventories drop to 0. Das Beispiel erfasst die gelöschten Zeilen und fügt sie in einer anderen Tabelle (ZeroInventory) ein, in der Produkte ohne Bestand gespeichert werden.The example captures the rows that are deleted and inserts them into another table, ZeroInventory, which tracks products with no inventory.

--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.W. Einfügen von Daten mit der SELECT-OptionInserting data using the SELECT option

Im folgenden Beispiel wird gezeigt, wie mehrere Datenzeilen mithilfe einer INSERT-Anweisung mit einer SELECT-Option eingefügt werden.The following example shows how to insert multiple rows of data using an INSERT statement with a SELECT option. Die erste INSERT-Anweisung verwendet eine SELECT-Anweisung direkt, um Daten aus der Quelltabelle abzurufen und dann das Resultset in der Tabelle EmployeeTitles zu speichern.The first INSERT statement uses a SELECT statement directly to retrieve data from the source table, and then to store the result set in the EmployeeTitles table.

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.X. Angeben einer Bezeichnung mit der INSERT-AnweisungSpecifying a label with the INSERT statement

Im folgenden Beispiel wird die Verwendung einer Bezeichnung mit einer INSERT-Anweisung gezeigt.The following example shows the use of a label with an INSERT statement.

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

Y.Y. Verwenden einer Bezeichnung und eines Abfragehinweises mit der Anweisung INSERTUsing a label and a query hint with the INSERT statement

Diese Abfrage zeigt die grundlegende Syntax für die Verwendung einer Bezeichnung und eines Join-Abfragehinweises mit der INSERT-Anweisung.This query shows the basic syntax for using a label and a query join hint with the INSERT statement. Nachdem die Abfrage an den Steuerungsknoten übermittelt wurde, wird die Hashjoinstrategie angewendet, wenn SQL ServerSQL Server (wird auf den Computeknoten ausgeführt) den SQL ServerSQL Server-Abfrageplan generiert.After the query is submitted to the Control node, SQL ServerSQL Server, running on the Compute nodes, will apply the hash join strategy when it generates the SQL ServerSQL Server query plan. Weitere Informationen zu Joinhinweisen und der Verwendung der OPTION-Klausel finden Sie unter OPTION (SQL Server PDW).For more information on join hints and how to use the OPTION clause, see OPTION (SQL Server PDW).

-- Uses AdventureWorks  
  
INSERT INTO DimCustomer (CustomerKey, CustomerAlternateKey, 
    FirstName, MiddleName, LastName )   
SELECT ProspectiveBuyerKey, ProspectAlternateKey, 
    FirstName, MiddleName, LastName  
FROM ProspectiveBuyer p JOIN DimGeography g ON p.PostalCode = g.PostalCode  
WHERE g.CountryRegionCode = 'FR'  
OPTION ( LABEL = 'Add French Prospects', HASH JOIN);  

Weitere InformationenSee Also

BULK INSERT (Transact-SQL) BULK INSERT (Transact-SQL)
DELETE (Transact-SQL) DELETE (Transact-SQL)
EXECUTE (Transact-SQL) EXECUTE (Transact-SQL)
FROM (Transact-SQL) FROM (Transact-SQL)
IDENTITY (Eigenschaft) (Transact-SQL) IDENTITY (Property) (Transact-SQL)
NEWID (Transact-SQL) NEWID (Transact-SQL)
SELECT (Transact-SQL) SELECT (Transact-SQL)
UPDATE (Transact-SQL) UPDATE (Transact-SQL)
MERGE (Transact-SQL) MERGE (Transact-SQL)
OUTPUT-Klausel (Transact-SQL) OUTPUT Clause (Transact-SQL)
Verwenden der Tabellen inserted und deletedUse the inserted and deleted Tables