INSERT (Transact-SQL)
Fügt einer Tabelle oder Sicht eine neue Zeile hinzu.
Transact-SQL-Syntaxkonventionen
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 ] )
| derived_table
| execute_statement
}
}
| DEFAULT VALUES
[; ]
<object> ::=
{
[ server_name . database_name . schema_name .
| database_name .[ schema_name ] .
| schema_name .
]
table_or_view_name
}
Argumente
WITH <common_table_expression>
Gibt das temporäre benannte Resultset (auch allgemeiner Tabellenausdruck genannt) an, das innerhalb des Bereichs der INSERT-Anweisung definiert ist. Das Resultset ist 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 eingefügt werden kann.
- server_name
Der Name des Servers (mit der OPENDATASOURCE-Funktion als Servername), auf dem sich die Tabelle oder Sicht befindet. Wenn server_name angegeben ist, sind database_name und schema_name erforderlich.
- 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- oder die OPENROWSET-Funktion
WITH ( <table_hint_limited> [... n ] )
Gibt einen oder mehrere Tabellenhinweise an, die für eine Zieltabelle zulässig sind. Das WITH-Schlüsselwort und die Klammern sind erforderlich.READPAST, NOLOCK und READUNCOMMITTED sind nicht zulässig. Weitere Informationen zu Tabellenhinweisen finden Sie unter Tabellenhinweis (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 aktuell 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 einer oder mehreren Spalten, 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 SQL Server 2005-Datenbankmodul in der Lage sein, basierend auf der Spaltendefinition einen Wert bereitzustellen. Andernfalls kann die Zeile nicht geladen werden. 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 die VALUES-Liste müssen verwendet werden, wenn in eine Identitätsspalte explizite Werte eingefügt werden. Dabei muss die Option SET IDENTITY_INSERT für die Tabelle auf ON festgelegt sein.
- OUTPUT-Klausel
Gibt eingefügte Zeilen als Teil des Einfügevorgangs zurück. 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.
VALUES
Steht vor der Liste der Werte, die eingefügt werden sollen. Für jede Spalte in column_list (falls angegeben) bzw. in der Tabelle muss ein Datenwert vorhanden sein. Die Wertliste muss in Klammern stehen.Wenn die Reihenfolge der Werte in der VALUES-Liste nicht mit der Reihenfolge der Spalten in der Tabelle übereinstimmt oder nicht für jede Spalte in der Tabelle ein Wert vorhanden ist, muss in column_list ausdrücklich angegeben werden, welcher Spalte ein eingehender Wert zugewiesen werden soll.
- DEFAULT
Erzwingt, dass 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 SELECT- oder EXECUTE-Anweisung enthalten.
- derived_table
Eine gültige SELECT-Anweisung, die in die Tabelle zu ladende Datenzeilen zurückgibt. Die SELECT-Anweisung kann keinen allgemeinen Tabellenausdruck (Common Table Expression, CTE) enthalten.
execute_statement
Eine gültige EXECUTE-Anweisung, die Daten mithilfe von SELECT- oder READTEXT-Anweisungen zurückgibt. Die SELECT-Anweisung kann keinen allgemeinen Tabellenausdruck enthalten.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 gesendet. Anschließend werden sie in die Tabelle auf dem lokalen Server geladen.
SQL Server 2008 ändert die Transaktionssemantik von INSERT...EXECUTE-Anweisungen, die für einen Loopbackverbindungsserver ausgeführt werden. In SQL Server 2005 wird dieses Szenario nicht unterstützt und verursacht einen Fehler. In SQL Server 2008 kann eine INSERT...EXECUTE-Anweisung für einen Loopbackverbindungsserver ausgeführt werden, wenn für die Verbindung MARS (Multiple Active Result Sets) nicht aktiviert ist. Wenn MARS für die Verbindung aktiviert ist, entspricht das Verhalten dem in SQL Server 2005.
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.
- DEFAULT VALUES
Erzwingt, dass die neue Zeile den für jede Spalte definierten Standardwert enthält.
Hinweise
INSERT fügt neue Zeilen an eine Tabelle an. Um Daten in einer Tabelle zu ersetzen, müssen DELETE- oder TRUNCATE TABLE-Anweisungen verwendet werden, die die vorhandenen Daten löschen, bevor mithilfe von INSERT neue Daten eingefügt werden. Verwenden Sie UPDATE, um Spaltenwerte in vorhandenen Zeilen zu ändern. Um eine neue Tabelle zu erstellen und gleichzeitig Daten zu laden, kann die Option INTO der SELECT-Anweisung verwendet werden.
Mit dem uniqueidentifier-Datentyp erstellte Spalten speichern speziell formatierte 16-Byte-Binärwerte. Anders als bei Identitätsspalten generiert Datenbankmodul für Spalten mit dem uniqueidentifier-Datentyp nicht automatisch Werte. Bei einem Einfügevorgang können Variablen mit einem uniqueidentifier-Datentyp und Zeichenfolgenkonstanten der Form xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx (36 Zeichen einschließlich 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) ermittelt werden.
Die Einstellung der Option SET ROWCOUNT wird für INSERT-Anweisungen ignoriert, die für lokale oder verteilte partitionierte Sichten ausgeführt werden. Außerdem wird diese Option nicht für INSERT-Anweisungen unterstützt, die für Remotetabellen in Datenbankmodul ausgeführt werden, wenn der Kompatibilitätsgrad auf 80 oder höher festgelegt ist.
Wenn in einer INSERT-Anweisung bei der Auswertung eines Ausdrucks ein arithmetischer Fehler (Überlauf, Division durch Null oder Domänenfehler) auftritt, behandelt Datenbankmodul den Fehler so, als wäre SET ARITHABORT auf ON festgelegt. Der restliche Batch wird beendet, und eine Fehlermeldung wird ausgegeben.
Regeln für das Einfügen von Zeilen
Für das Einfügen von Zeilen gelten folgende Regeln:
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, falls die Zeichenfolge nur aus Leerzeichen besteht.
varbinary
Löscht nachfolgende Nullen.
Wird eine leere Zeichenfolge (' ') in eine Spalte des varchar- oder text-Datentyps geladen, wird standardmäßig eine leere Zeichenfolge eingefügt.
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 Datenbankmodul zeigt eine Fehlermeldung an.
Durch das Einfügen eines NULL-Werts in eine Spalte des text- oder image-Datentyps wird kein gültiger Textzeiger erstellt, und es wird 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.
Wenn INSERT mehrere Zeilen mit SELECT oder EXECUTE lädt, bewirkt eine Verletzung einer Regel oder Einschränkung beim Laden der Werte, dass die gesamte Anweisung beendet und keine Zeile geladen wird.
Wenn in Tabellen einer Remoteinstanz von Datenbankmodul 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.
Verwenden von INSTEAD OF-Triggern in INSERT-Aktionen
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. Frühere Versionen von SQL Server unterstützen nur in der INSERT-Anweisung und anderen Anweisungen zur Datenänderung definierte AFTER-Trigger. Weitere Informationen zu INSTEAD OF-Triggern finden Sie unter CREATE TRIGGER (Transact-SQL).
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 eines SQL Server 2005-Systemdatentyps, sofern der benutzerdefinierte Typ implizite oder explizite Konvertierung von diesem Typ unterstützt. Das folgende Beispiel zeigt, wie ein Wert durch explizite Konvertierung von 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 TypsPoint
zu erstellen und den Wert in dieCities
-Tabelle einzufügen.INSERT INTO Cities (Location) VALUES ( dbo.CreateNewPoint(x, y) );
Verwenden von OPENROWSET und BULK zum Massenladen von Daten
In SQL Server 2005-Datenbankmodul bieten neue Tabellenhinweise, die mit dem OPENROWSET BULK-Rowsetanbieter verfügbar sind, die folgenden Optimierungen für das Massenladen mit der INSERT-Anweisung:
- Protokollierung des Massenladens (minimiert die Anzahl der Protokolldatensätze für den Einfügevorgang)
- Einschränkungsüberprüfung kann aktiviert oder deaktiviert werden
- Triggerausführung kann aktiviert oder deaktiviert werden
Diese Optimierungen sind mit denen vergleichbar, die mit dem BULK INSERT-Befehl verfügbar sind.
Wenn eine INSERT-Anweisung einen Massenladevorgang in eine nicht leere Tabelle ausführt, bestehen die folgenden zusätzlichen Leistungsverbesserungen:
- Wenn eine Seite während des Massenladens geteilt wird, müssen die neuen Zeilen, die der Seite hinzugefügt werden, nicht vollständig protokolliert werden.
- Wenn in der Tabelle nicht gruppierte Indizes und keine gruppierten Indizes vorhanden sind, müssen die einzelnen Indexzeilen möglicherweise vollständig protokolliert werden, die Datenzeilen müssen jedoch nicht vollständig protokolliert werden.
Weitere Informationen finden Sie unter OPENROWSET (Transact-SQL) und Tabellenhinweis (Transact-SQL).
Berechtigungen
Die INSERT-Berechtigung ist für die Zieltabelle erforderlich.
Die INSERT-Berechtigungen erhalten standardmäßig Mitglieder der festen Serverrolle sysadmin, der festen Datenbankrollen db_owner und db_datawriter und der Tabellenbesitzer. 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 Option BULK der OPENROWSET-Funktion müssen Sie Mitglied der festen Serverrolle sysadmin oder der festen Serverrolle bulkadmin sein.
Beispiele
A. Verwenden einer einfachen INSERT-Anweisung
Im folgenden Beispiel wird eine Zeile in die Production.UnitMeasure
-Tabelle eingefügt. 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 column_list. angegeben werden.
USE AdventureWorks;
GO
INSERT INTO Production.UnitMeasure
VALUES (N'F2', N'Square Feet', GETDATE());
GO
B. Einfügen von Daten, deren Reihenfolge nicht mit der Reihenfolge der Tabellenspalten übereinstimmt
Im folgenden Beispiel wird column_list verwendet, um die in jede Spalte einzufügenden Werte explizit anzugeben. Die Spaltenreihenfolge in der UnitMeasure
-Tabelle lautet UnitMeasureCode
, Name
, ModifiedDate
. Die Spalten sind jedoch nicht in dieser Reihenfolge in column_list aufgelistet.
USE AdventureWorks;
GO
INSERT INTO Production.UnitMeasure (Name, UnitMeasureCode,
ModifiedDate)
VALUES (N'Square Yards', N'Y2', GETDATE());
GO
C. Einfügen von Daten mit weniger Werten als Spalten
Das folgende Beispiel zeigt das Einfügen von Zeilen in eine Tabelle mit Spalten, die automatisch einen Wert generieren oder einen Standardwert haben. Die INSERT
-Anweisungen fügen Zeilen ein, die Werte für einige (aber nicht alle) Spalten enthalten. In der letzten INSERT
-Anweisung werden keine Spalten angegeben, und nur die Standardwerte werden eingefügt.
USE AdventureWorks;
GO
IF OBJECT_ID ('dbo.T1', 'U') IS NOT NULL
DROP TABLE dbo.T1;
GO
CREATE TABLE dbo.T1
(
column_1 int IDENTITY,
column_2 varchar(30)
CONSTRAINT default_name DEFAULT ('my column default'),
column_3 timestamp,
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
D. Einfügen von Daten in eine Tabelle mit Identitätsspalte
Das folgende Beispiel zeigt verschiedene Methoden zum Einfügen von Daten in eine Identitätsspalte. Die ersten beiden INSERT
-Anweisungen ermöglichen das Generieren von Identitätswerten für die neuen Zeilen. Die dritte INSERT
-Anweisung setzt die IDENTITY
-Eigenschaft für die Spalte mit der SET IDENTITY_INSERT
-Anweisung außer Kraft und fügt in die Identitätsspalte einen expliziten Wert ein.
USE AdventureWorks;
GO
IF OBJECT_ID ('dbo.T1', 'U') IS NOT NULL
DROP TABLE dbo.T1;
GO
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
E. Einfügen von Daten in eine uniqueidentifier-Spalte mithilfe von NEWID()
Im folgenden Beispiel wird die NEWID()-Funktion verwendet, um einen GUID für column_2
zu erhalten. Anders als bei Identitätsspalten generiert Datenbankmodul nicht automatisch Werte für Spalten mit dem uniqueidentifier-Datentyp, wie durch die zweite INSERT
-Anweisung gezeigt.
USE AdventureWorks;
GO
IF OBJECT_ID ('dbo.T1', 'U') IS NOT NULL
DROP TABLE dbo.T1;
GO
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;
GO
E. Einfügen von Daten in eine Tabelle über eine Sicht
Das folgende Beispiel gibt einen Sichtnamen in der INSERT
-Anweisung an. Die neue Zeile wird jedoch in die zugrunde liegende Tabelle der Sicht eingefügt. Die Reihenfolge der VALUES
-Liste in der INSERT
-Anweisung muss mit der Reihenfolge der Spalten in der Sicht übereinstimmen.
USE AdventureWorks;
GO
IF OBJECT_ID ('dbo.T1', 'U') IS NOT NULL
DROP TABLE dbo.T1;
GO
IF OBJECT_ID ('dbo.V1', 'V') IS NOT NULL
DROP VIEW dbo.V1;
GO
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
G. Einfügen von Daten mit den Optionen SELECT und EXECUTE
Im folgenden Beispiel werden drei Methoden gezeigt, um Daten aus einer Tabelle zu lesen und in eine andere Tabelle einzufügen. Jede Methode basiert auf einer SELECT-Anweisung mit mehreren Tabellen, die einen Ausdruck und einen Literalwert in der Spaltenliste enthält.
Die erste INSERT
-Anweisung verwendet eine SELECT
-Anweisung direkt, um Daten aus den Quelltabellen (Employee
, SalesPerson
und Contact
) abzurufen und das Resultset in der EmployeeSales
-Tabelle zu speichern. Die zweite INSERT
-Anweisung führt eine gespeicherte Prozedur aus, die die SELECT
-Anweisung enthält, und die dritte INSERT
-Anweisung führt die SELECT
-Anweisung als Literalzeichenfolge aus.
USE AdventureWorks;
GO
IF OBJECT_ID ('dbo.EmployeeSales', 'U') IS NOT NULL
DROP TABLE dbo.EmployeeSales;
GO
IF OBJECT_ID ('dbo.uspGetEmployeeSales', 'P') IS NOT NULL
DROP PROCEDURE uspGetEmployeeSales;
GO
CREATE TABLE dbo.EmployeeSales
( DataSource varchar(20) NOT NULL,
EmployeeID varchar(11) NOT NULL,
LastName varchar(40) NOT NULL,
SalesDollars money NOT NULL
);
GO
CREATE PROCEDURE dbo.uspGetEmployeeSales
AS
SET NOCOUNT ON;
SELECT 'PROCEDURE', e.EmployeeID, c.LastName,
sp.SalesYTD
FROM HumanResources.Employee AS e
INNER JOIN Sales.SalesPerson AS sp
ON e.EmployeeID = sp.SalesPersonID
INNER JOIN Person.Contact AS c
ON e.ContactID = c.ContactID
WHERE e.EmployeeID LIKE '2%'
ORDER BY e.EmployeeID, c.LastName;
GO
--INSERT...SELECT example
INSERT dbo.EmployeeSales
SELECT 'SELECT', e.EmployeeID, c.LastName, sp.SalesYTD
FROM HumanResources.Employee AS e
INNER JOIN Sales.SalesPerson AS sp
ON e.EmployeeID = sp.SalesPersonID
INNER JOIN Person.Contact AS c
ON e.ContactID = c.ContactID
WHERE e.EmployeeID LIKE '2%'
ORDER BY e.EmployeeID, c.LastName;
GO
--INSERT...EXECUTE procedure example
INSERT EmployeeSales
EXECUTE uspGetEmployeeSales;
GO
--INSERT...EXECUTE('string') example
INSERT EmployeeSales
EXECUTE
('
SELECT ''EXEC STRING'', e.EmployeeID, c.LastName,
sp.SalesYTD
FROM HumanResources.Employee AS e
INNER JOIN Sales.SalesPerson AS sp
ON e.EmployeeID = sp.SalesPersonID
INNER JOIN Person.Contact AS c
ON e.ContactID = c.ContactID
WHERE e.EmployeeID LIKE ''2%''
ORDER BY e.EmployeeID, c.LastName
');
GO
--Show results.
SELECT DataSource,EmployeeID,LastName,SalesDollars
FROM dbo.EmployeeSales;
GO
H. Einfügen von Daten mithilfe der TOP-Klausel
Im folgenden Beispiel wird die NewEmployee
-Tabelle erstellt, und es werden Adressdaten für die ersten 10 Mitarbeiter aus der Employee
-Tabelle eingefügt. Dann wird die SELECT
-Anweisung ausgeführt, um den Inhalt der NewEmployee
-Tabelle zu überprüfen.
USE AdventureWorks;
GO
IF OBJECT_ID (N'HumanResources.NewEmployee', N'U') IS NOT NULL
DROP TABLE HumanResources.NewEmployee;
GO
CREATE TABLE HumanResources.NewEmployee
(
EmployeeID int NOT NULL,
LastName nvarchar(50) NOT NULL,
FirstName nvarchar(50) NOT NULL,
Phone 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
INSERT TOP (10) INTO HumanResources.NewEmployee
SELECT
e.EmployeeID, c.LastName, c.FirstName, c.Phone,
a.AddressLine1, a.City, sp.StateProvinceCode,
a.PostalCode, e.CurrentFlag
FROM HumanResources.Employee e
INNER JOIN HumanResources.EmployeeAddress AS ea
ON e.EmployeeID = ea.EmployeeID
INNER JOIN Person.Address AS a
ON ea.AddressID = a.AddressID
INNER JOIN Person.StateProvince AS sp
ON a.StateProvinceID = sp.StateProvinceID
INNER JOIN Person.Contact as c
ON e.ContactID = c.ContactID;
GO
SELECT EmployeeID, LastName, FirstName, Phone,
AddressLine1, City, State, PostalCode, CurrentFlag
FROM HumanResources.NewEmployee;
GO
I. Verwenden von OUTPUT mit einer INSERT-Anweisung
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
table-Variable zurückzugeben. Da die ScrapReasonID
-Spalte mit einer IDENTITY
-Eigenschaft definiert ist, wird kein Wert für diese Spalte in der INSERT
-Anweisung angegeben. Beachten Sie jedoch, dass der von Datenbankmodul für diese Spalte generierte Wert in der OUTPUT
-Klausel in der INSERTED.ScrapReasonID
-Spalte zurückgegeben wird.
USE AdventureWorks;
GO
DECLARE @MyTableVar table( ScrapReasonID 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 ScrapReasonID, Name, ModifiedDate FROM @MyTableVar;
--Display the result set of the table.
SELECT ScrapReasonID, Name, ModifiedDate
FROM Production.ScrapReason;
GO
J. Verwenden von WITH common_table_expression mit einer INSERT-Anweisung
Im folgenden Beispiel wird die NewEmployee
-Tabelle erstellt. Ein allgemeiner Tabellenausdruck (EmployeeTemp
) definiert die in die NewEmployee
-Tabelle einzufügenden Zeilen. Die INSERT
-Anweisung verweist auf die Spalten im allgemeinen Tabellenausdruck.
USE AdventureWorks;
GO
IF OBJECT_ID (N'HumanResources.NewEmployee', N'U') IS NOT NULL
DROP TABLE HumanResources.NewEmployee;
GO
CREATE TABLE HumanResources.NewEmployee
(
EmployeeID int NOT NULL,
LastName nvarchar(50) NOT NULL,
FirstName nvarchar(50) NOT NULL,
Phone 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.EmployeeID, c.LastName, c.FirstName, c.Phone,
a.AddressLine1, a.City, sp.StateProvinceCode,
a.PostalCode, e.CurrentFlag
FROM HumanResources.Employee e
INNER JOIN HumanResources.EmployeeAddress AS ea
ON e.EmployeeID = ea.EmployeeID
INNER JOIN Person.Address AS a
ON ea.AddressID = a.AddressID
INNER JOIN Person.StateProvince AS sp
ON a.StateProvinceID = sp.StateProvinceID
INNER JOIN Person.Contact as c
ON e.ContactID = c.ContactID
)
INSERT INTO HumanResources.NewEmployee
SELECT EmpID, LastName, FirstName, Phone,
Address, City, StateProvince, PostalCode, CurrentFlag
FROM EmployeeTemp;
GO
K. Verwenden von OUTPUT mit Identitätsspalten und berechneten Spalten
Im folgenden Beispiel wird die EmployeeSales
-Tabelle erstellt, und es werden anschließend mehrere Zeilen mithilfe einer INSERT-Anweisung mit einer SELECT-Anweisung zum Abrufen der Daten aus den Quelltabellen in die Tabelle eingefügt. Die EmployeeSales
-Tabelle enthält eine Identitätsspalte (EmployeeID
) sowie eine berechnete Spalte (ProjectedSales
). Da diese Werte während des Einfügevorgangs von Datenbankmodul generiert werden, kann keine dieser Spalten in @MyTableVar
definiert werden.
USE AdventureWorks ;
GO
IF OBJECT_ID ('dbo.EmployeeSales', 'U') IS NOT NULL
DROP TABLE dbo.EmployeeSales;
GO
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 HumanResources.Employee AS e
INNER JOIN Sales.SalesPerson AS sp
ON e.EmployeeID = sp.SalesPersonID
INNER JOIN Person.Contact AS c
ON e.ContactID = c.ContactID
WHERE e.EmployeeID LIKE '2%'
ORDER BY c.LastName, c.FirstName;
SELECT LastName, FirstName, CurrentSales
FROM @MyTableVar;
GO
SELECT EmployeeID, LastName, FirstName, CurrentSales, ProjectedSales
FROM dbo.EmployeeSales;
GO
Siehe auch
Verweis
BULK INSERT (Transact-SQL)
CREATE TABLE (Transact-SQL)
DELETE (Transact-SQL)
EXECUTE (Transact-SQL)
FROM (Transact-SQL)
IDENTITY-Eigenschaft (Transact-SQL)
NEWID (Transact-SQL)
SELECT (Transact-SQL)
SET ROWCOUNT (Transact-SQL)
UPDATE (Transact-SQL)
Andere Ressourcen
Einfügen von Daten in eine Tabelle