INSERT (Transact-SQL)
Fügt einer Tabelle oder Sicht eine oder mehrere neue Zeilen hinzu. Beispiele finden Sie unter INSERT-Beispiele (Transact-SQL).
Syntax
[ 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 ] ) ]
Argumente
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. Das Resultset wird von einer SELECT-Anweisung abgeleitet.Allgemeine Tabellenausdrücke können auch mit den Anweisungen SELECT, DELETE, UPDATE und CREATE VIEW verwendet werden. Weitere Informationen finden Sie unter WITH common_table_expression (Transact-SQL).
TOP (expression) [ PERCENT ]
Gibt die Anzahl oder den Prozentsatz zufälliger Zeilen an, die eingefügt werden. expression kann entweder eine Anzahl oder ein Prozentsatz der Zeilen sein. Die Zeilen, auf die im TOP-Ausdruck verwiesen wird, die mit INSERT, UPDATE oder DELETE verwendet werden, sind nicht in einer bestimmten Reihenfolge angeordnet.Klammern, die expression in TOP begrenzen, sind in INSERT-, UPDATE- und DELETE-Anweisungen erforderlich. Weitere Informationen finden Sie unter TOP (Transact-SQL).
INTO
Ein optionales Schlüsselwort, das zwischen INSERT und der Zieltabelle verwendet werden kann.server_name
Der Name des Verbindungsservers, auf dem sich die Tabelle oder Sicht befindet. server_name kann als Name eines Verbindungsservers oder mithilfe der OPENDATASOURCE-Funktion angengeben werden.Wenn server_name als Verbindungsserver angegeben wird, sind database_name und schema_name erforderlich. 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. Weitere Informationen finden Sie unter Verteilte Abfragen.
database_name
Der Name der Datenbank.schema_name
Der Name des Schemas, zu dem die Tabelle oder Sicht gehört.table_or view_name
Der Name der Tabelle oder Sicht, die die Daten empfangen soll.Innerhalb ihres Bereichs kann eine table-Variable als Tabellenquelle in einer INSERT-Anweisung verwendet werden.
Die Sicht, auf die table_or_view_name verweist, muss aktualisierbar sein und auf genau eine Basistabelle in der FROM-Klausel der Sicht verweisen. Beispielsweise darf die column_list einer INSERT-Anweisung für eine auf mehreren Tabellen basierende Sicht nur auf Spalten einer einzigen Basistabelle verweisen. Weitere Informationen zu aktualisierbaren Sichten finden Sie unter CREATE VIEW (Transact-SQL).
rowset_function_limited
Die OPENQUERY-Funktion oder die OPENROWSET-Funktion. Die Verwendung dieser Funktionen unterliegt den Funktionen des OLE DB-Anbieters, der auf das Remoteobjekt zugreift. Weitere Informationen finden Sie unter Verteilte Abfragen.WITH ( <table_hint_limited> [... n ] )
Gibt mindestens einen Tabellenhinweis an, der für eine Zieltabelle zulässig ist. Das WITH-Schlüsselwort und die Klammern sind erforderlich.READPAST, NOLOCK und READUNCOMMITTED sind nicht zulässig. Weitere Informationen zu Tabellenhinweisen finden Sie unter Tabellenhinweise (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 Server entfernt. Diese Hinweise beeinträchtigen die Leistung von INSERT-Anweisungen nicht. Vermeiden Sie ihre Verwendung bei neuen Entwicklungsarbeiten, und planen Sie die Änderung von Anwendungen, in denen sie derzeit verwendet werden.
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. Auf die Tabelle wird eine exklusive Sperre angewendet.
(column_list)
Eine Liste mit mindestens einer Spalte, in die Daten eingefügt werden. column_list muss in Klammern gesetzt werden; die einzelnen Einträge werden durch Kommas getrennt.Ist eine Spalte nicht in column_list enthalten, muss Database Engine (Datenbankmodul) in der Lage sein, basierend auf der Spaltendefinition einen Wert bereitzustellen. Andernfalls kann die Zeile nicht geladen werden. Database Engine (Datenbankmodul) stellt automatisch einen Wert für die Spalte bereit, wenn für sie eine der folgenden Bedingungen erfüllt ist:
Besitzt eine IDENTITY-Eigenschaft. Der nächste Identitätswert wird verwendet.
Verfügt über einen Standardwert. Der Standardwert der Spalte wird verwendet.
Hat den Datentyp timestamp. Der aktuelle Timestampwert wird verwendet.
Lässt NULL-Werte zu. Ein NULL-Wert wird verwendet.
Die Spalte ist eine berechnete Spalte. Der berechnete Wert wird verwendet.
column_list und eine Werteliste müssen beim Einfügen von expliziten Werten in eine Identitätsspalte verwendet werden. Dabei muss die SET IDENTITY_INSERT-Option für die Tabelle auf ON festgelegt sein.
OUTPUT-Klausel
Gibt eingefügte Zeilen als Teil des Einfügevorgangs zurück. Die Ergebnisse können an die Verarbeitungsanwendung zurückgegeben bzw. zur weiteren Verarbeitung in eine Tabelle oder eine Tabellenvariable eingefügt werden.Die OUTPUT-Klausel wird nicht unterstützt in DML-Anweisungen, die auf lokale partitionierte Sichten, verteilte partitionierte Sichten oder Remotetabellen verweisen, oder INSERT-Anweisungen, die execute_statement enthalten. Die OUTPUT INTO-Klausel wird nicht in INSERT-Anweisungen unterstützt, die eine <dml_table_source>-Klausel enthalten.
VALUES
Steht vor der Liste oder den Listen der Datenwerte, die eingefügt werden sollen. Für jede Spalte in column_list (falls angegeben) bzw. in der Tabelle muss ein Datenwert vorhanden sein. Die Werteliste muss in Klammern stehen.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.
In SQL Server 2008 wird der Transact-SQL-Zeilenkonstruktor (auch Tabellenwertkonstruktor genannt) eingeführt, mit dem mehrere Zeilen in einer einzelnen INSERT-Anweisung angegeben werden können. Der Zeilenkonstruktor besteht aus einer einzelnen VALUES-Klausel mit mehreren Wertelisten, die in Klammern eingeschlossen und durch ein Komma getrennt sind. Weitere Informationen finden Sie unter Tabellenwertkonstruktor (Transact-SQL).
DEFAULT
Erzwingt, dass Database Engine (Datenbankmodul) den für eine Spalte definierten Standardwert lädt. Wenn für die Spalte kein Standardwert vorhanden ist und die Spalte NULL-Werte zulässt, wird NULL eingefügt. Für eine Spalte, die mit dem Datentyp timestamp definiert ist, wird der nächste Timestampwert eingefügt. DEFAULT ist für eine Identitätsspalte nicht zulässig.expression
Eine Konstante, eine Variable oder ein Ausdruck. Der Ausdruck darf keine EXECUTE-Anweisung enthalten.In Verweisen auf die Unicodezeichen-Datentypen nchar, nvarchar und ntext sollte "expression" der Großbuchstabe "N" vorangestellt werden. Wenn "N" nicht angegeben wird, konvertiert SQL Server die Zeichenfolge in die Codepage, die der Standardsortierung der Datenbank oder Spalte entspricht. Alle Zeichen, die in der betreffenden Codepage nicht gefunden werden, gehen verloren. Weitere Informationen finden Sie unter Serverseitige Programmierung mit Unicode.
derived_table
Eine gültige SELECT-Anweisung, die in die Tabelle zu ladende Datenzeilen zurückgibt. Die SELECT-Anweisung kann keinen allgemeinen Tabellenausdruck (CTE, Common Table Expression) enthalten.execute_statement
Eine gültige EXECUTE-Anweisung, die Daten mithilfe von SELECT- oder READTEXT-Anweisungen zurückgibt.Wenn execute_statement mit INSERT verwendet wird, muss jedes Resultset mit den Spalten in der Tabelle oder in column_list kompatibel sein.
execute_statement kann zum Ausführen gespeicherter Prozeduren auf dem gleichen Server oder auf einem Remoteserver verwendet werden. Die Prozedur auf dem Remoteserver wird ausgeführt, und die Resultsets werden an den lokalen Server zurückgegeben. Anschließend werden sie in die Tabelle auf dem lokalen Server geladen. In einer verteilten Transaktion kann execute_statement nicht für einen Loopback-Verbindungsserver ausgeführt werden, wenn für die Verbindung Multiple Active Result Sets (MARS) aktiviert ist.
Wenn execute_statement Daten mithilfe der READTEXT-Anweisung zurückgibt, kann jede READTEXT-Anweisung maximal 1 MB (1024 KB) Daten zurückgeben. Darüber hinaus kann execute_statement mit erweiterten Prozeduren verwendet werden. Hierbei fügt execute_statement die Daten ein, die vom Hauptthread der erweiterten Prozedur zurückgegeben werden. Daten, die nicht vom Hauptthread, sondern von anderen Threads ausgegeben werden, werden nicht eingefügt.
Sie können keinen Tabellenwertparameter als Ziel einer INSERT EXEC-Anweisung angeben; er kann jedoch als Quelle in der INSERT EXEC-Zeichenfolge oder der gespeicherter Prozedur angegeben werden. Weitere Informationen finden Sie unter Tabellenwertparameter (Datenbankmodul).
<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. Wenn <dml_table_source> angegeben ist, muss das Ziel der äußeren INSERT-Anweisung die folgenden Einschränkungen einhalten:Die Tabelle muss eine Basistabelle sein, keine Sicht.
Die Tabelle darf keine Remotetabelle sein.
Für die Tabelle dürfen keine Trigger definiert sein.
Die Tabelle darf an keinen Primär-/Fremdschlüsselbeziehungen teilnehmen.
Sie darf nicht an Mergereplikationen oder aktualisierbaren Abonnements für Transaktionsreplikationen teilnehmen.
Der Kompatibilitätsgrad der Datenbank muss auf 100 festgelegt sein.
<select_list>
Eine durch Trennzeichen getrennte Liste, die angibt, welche von der OUTPUT-Klausel zurückgegebenen Spalten eingefügt werden sollen. Die Spalten in <select_list> müssen mit den Spalten kompatibel sein, in die Werte eingefügt werden. <select_list> kann nicht auf Aggregatfunktionen oder TEXTPTR verweisen.Hinweis In der SELECT-Liste aufgeführte Variablen verweisen auf ihre ursprünglichen Werte, unabhängig von den Änderungen, die in <dml_statement_with_output_clause> daran vorgenommen wurden.
<dml_statement_with_output_clause>
Eine gültige Anweisung INSERT, UPDATE, DELETE oder MERGE, die betroffene Zeilen in einer OUTPUT-Klausel zurückgibt. Die Anweisung darf keine WITH-Klausel enthalten und sich nicht auf Remotetabellen oder partitionierte Sichten beziehen. Wenn UPDATE oder DELETE angegeben wird, darf kein cursorbasiertes UPDATE oder DELETE verwendet werden. Auf Quellzeilen darf nicht als geschachtelte DML-Anweisungen verwiesen werden.WHERE <search_condition>
WHERE-Klausel mit gültiger <search_condition>, die die von <dml_statement_with_output_clause> zurückgegebenen Zeilen filtert. Weitere Informationen finden Sie unter Suchbedingung (Transact-SQL). Bei Verwendung in diesem Kontext darf <search_condition> keine Unterabfragen, benutzerdefinierten Skalarfunktionen für einen Datenzugriff, Aggregatfunktionen, TEXTPTR oder Prädikate der Volltextsuche enthalten.DEFAULT VALUES
Erzwingt, dass die neue Zeile den für jede Spalte definierten Standardwert enthält.
Bewährte Methoden zum Massenladen von Daten
Verwenden von INSERT INTO…SELECT zum Massenladen von Daten mit minimaler Protokollierung
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 einer andere Tabelle mit minimaler Protokollierung zu übertragen. 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.
Bei der minimalen Protokollierung für diese Anweisung müssen die folgenden Voraussetzungen erfüllt sein:
Das Wiederherstellungsmodell der Datenbank ist auf einfach oder massenprotokolliert festgelegt.
Die Zieltabelle ist ein leerer oder nicht leerer Heap.
Die Zieltabelle wird nicht in der Replikation verwendet.
Der TABLOCK-Hinweis wird für die Zieltabelle angegeben.
Zeilen, die infolge einer Einfügeaktion in eine MERGE-Anweisung in einen Heap eingefügt werden, können ebenfalls minimal protokolliert werden.
Im Gegensatz zur BULK INSERT-Anweisung, die eine weniger restriktive Massenaktualisierungssperre enthält, weist INSERT INTO…SELECT mit dem TABLOCK-Hinweis eine exklusive Sperre (X) für die Tabelle auf. Das bedeutet, dass Sie keine Zeilen mit parallelen Einfügevorgängen einfügen können. Weitere Informationen zu Sperren finden Sie unter Sperrmodi.
Verwenden von OPENROWSET und BULK zum Massenladen von Daten
Von der OPENROWSET-Funktion können die folgenden Tabellenhinweise akzeptiert werden, die Massenladeoptimierungen mit der INSERT-Anweisung bereistellen:
Der TABLOCK-Hinweis kann die Anzahl der Protokolldatensätze für den Einfügevorgang minimieren. Das Wiederherstellungsmodell der Datenbank muss auf einfach oder massenprotokolliert festgelegt werden, und die Zieltabelle kann nicht in der Replikation verwendet werden. Weitere Informationen finden Sie unter Voraussetzungen für die minimale Protokollierung beim Massenimport.
Durch den IGNORE_CONSTRAINTS-Hinweis kann vorübergehend die FOREIGN KEY- und CHECK-Einschränkungsüberprüfung deaktiviert werden.
Durch den IGNORE_TRIGGERS-Hinweis kann vorübergehend die Ausführung des Triggers deaktiviert werden.
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.
Der KEEPIDENTITY-Hinweis ermöglicht die Verwendung der Identitätswerte in der importierten Datendatei für die Identitätsspalte in der Zieltabelle.
Diese Optimierungen sind mit denen vergleichbar, die mit dem BULK INSERT-Befehl verfügbar sind. Weitere Informationen finden Sie unter Tabellenhinweise (Transact-SQL).
Datentypen
Beachten Sie beim Einfügen von Zeilen das folgende Datentypverhalten:
Wird ein Wert in Spalten des char-, varchar- oder varbinary-Datentyps geladen, ist das Auffüllen 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. Weitere Informationen finden Sie unter SET ANSI_PADDING (Transact-SQL).
Die folgende Tabelle zeigt den Standardvorgang für SET ANSI_PADDING OFF.
Datentyp
Standardvorgang
char
Füllt den Wert mit Leerzeichen auf, bis die definierte Breite der Spalte erreicht ist.
varchar
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.
varbinary
Löscht nachfolgende Nullen.
Wird eine leere Zeichenfolge (' ') in eine Spalte mit dem varchar-Datentyp oder text-Datentyp geladen, wird standardmäßig eine Zeichenfolge der Länge NULL eingefügt.
Durch das Einfügen eines NULL-Werts in eine Spalte des text-Datentyps oder image-Datentyps wird kein gültiger Textzeiger erstellt, und es wird vorab auch keine 8-KB-Textseite zugeordnet. Weitere Informationen zum Einfügen von text- und image-Datentypen finden Sie unter Verwenden von text-, ntext- und image-Funktionen.
Mit dem uniqueidentifier-Datentyp erstellte Spalten enthalten speziell formatierte 16-Byte-Binärwerte. Anders als bei Identitätsspalten generiert Database Engine (Datenbankmodul) für Spalten mit dem uniqueidentifier-Datentyp keine automatischen Werte. 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. Der Wert 6F9619FF-8B86-D011-B42D-00C04FC964FF ist z. B. ein gültiger Wert für eine uniqueidentifier-Variable oder -Spalte. Mit der NEWID()-Funktion kann ein GUID (Globally Unique Identifier) abgerufen werden.
Einfügen von Werten in Spalten eines benutzerdefinierten Typs
Sie können Werte in Spalten eines benutzerdefinierten Typs einfügen, indem Sie eine der folgenden Methoden verwenden:
Bereitstellen eines Werts des benutzerdefinierten Typs
Bereitstellen eines Werts in einem SQL Server-Systemdatentyps, sofern der benutzerdefinierte Typ implizite oder explizite Konvertierung aus diesem Typ unterstützt. Das folgende Beispiel zeigt, wie ein Wert durch explizite Konvertierung aus einer Zeichenfolge in eine Spalte des benutzerdefinierten Typs Point eingefügt wird.
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. Weitere Informationen zu Konvertierung und benutzerdefinierten Typen finden Sie unter Ausführen von Operationen an benutzerdefinierten Typen.
Aufrufen einer benutzerdefinierten Funktion, die einen Wert des benutzerdefinierten Typs zurückgibt. 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.
INSERT INTO Cities (Location) VALUES ( dbo.CreateNewPoint(x, y) );
Fehlerbehandlung
Sie können die Fehlerbehandlung für die INSERT-Anweisung durch Angeben der Anweisung in einem TRY…CATCH-Konstrukt implementieren. Weitere Informationen finden Sie unter Verwenden von TRY...CATCH in Transact-SQL.
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.
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.
Wenn in einer INSERT-Anweisung bei der Auswertung eines Ausdrucks ein arithmetischer Fehler (Überlauf, Division durch Null oder Domänenfehler) auftritt, behandelt Database Engine (Datenbankmodul) den Fehler so, als wäre SET ARITHABORT auf ON festgelegt. Der Batcj wird beendet, und eine Fehlermeldung wird zurückgegeben. 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 Server einen NULL-Wert ein oder aktualisiert ihn. Wenn die Zielspalte keine NULL-Werte zulässt, schlägt das Einfügen oder Aktualisieren fehl, und dem Benutzer wird ein Fehler angezeigt. Weitere Informationen finden Sie unter Verhalten bei aktivierten ARITHABORT und ARITHIGNORE.
Interoperabilität
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. Weitere Informationen zu INSTEAD OF-Triggern finden Sie unter CREATE TRIGGER (Transact-SQL).
Einschränkungen
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.
Die Einstellung der Option SET ROWCOUNT wird für INSERT-Anweisungen ignoriert, die für lokale oder verteilte partitionierte Sichten ausgeführt werden. Diese Option wird außerdem nicht für INSERT-Anweisungen unterstützt, die für Remotetabellen ausgegeben werden.
Wichtig |
---|
Das Verwenden von SET ROWCOUNT wird in der nächsten Version von SQL Server keine Auswirkungen auf die Anweisungen DELETE, INSERT und UPDATE haben. Verwenden Sie SET ROWCOUNT bei neuen Entwicklungsarbeiten nicht zusammen mit den Anweisungen DELETE, INSERT und UPDATE, und planen Sie die Änderung von Anwendungen, die SET ROWCOUNT derzeit verwenden. Stattdessen wird die Verwendung der TOP-Klausel empfohlen. |
Protokollierungsverhalten
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. Für diese Vorgänge ist eine minimale Protokollierung möglich. Weitere Informationen finden Sie im Abschnitt "Bewährte Methoden zum Massenladen von Daten" weiter oben in diesem Thema.
Sicherheit
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. Damit diese Verbindung funktioniert, müssen Sie mithilfe der gespeicherten Prozeduren von sp_addlinkedsrvlogin eine Benutzernamenzuordnung zwischen den Verbindungsservern erstellen. Weitere Informationen finden Sie unter Sicherheit für Verbindungsserver.
Für die Verwendung von OPENROWSET(BULK…) ist es wichtig, nachvollziehen zu können, wie in SQL Server mit Identitätswechseln umgegangen wird. Weitere Informationen finden Sie im Abschnitt "Überlegungen zur Sicherheit" unter Importieren von Massendaten mithilfe von BULK INSERT oder OPENROWSET(BULK...).
Berechtigungen
Die INSERT-Berechtigung ist für die Zieltabelle erforderlich.
Standardmäßig verfügen Mitglieder der festen Serverrolle sysadmin, der festen Datenbankrollen db_owner und db_datawriter sowie Tabellenbesitzer über INSERT-Berechtigungen. Mitglieder der Rollen sysadmin, db_owner und db_securityadmin sowie der Tabellenbesitzer können Berechtigungen an andere Benutzer übertragen.
Zum Ausführen von INSERT mit der BULK-Option der OPENROWSET-Funktion müssen Sie Mitglied der festen Serverrolle sysadmin oder der festen Serverrolle bulkadmin sein.