SELECT - INTO-Klausel (Transact-SQL)SELECT - INTO Clause (Transact-SQL)

Anwendungsbereich:Applies to: JaSQL ServerSQL Server (alle unterstützten Versionen) yesSQL ServerSQL Server (all supported versions) JaAzure SQL-DatenbankAzure SQL DatabaseYesAzure SQL-DatenbankAzure SQL Database JaVerwaltete Azure SQL-InstanzAzure SQL Managed InstanceYesVerwaltete Azure SQL-InstanzAzure SQL Managed Instance JaAzure Synapse AnalyticsAzure Synapse AnalyticsyesAzure Synapse AnalyticsAzure Synapse Analytics JaParallel Data WarehouseParallel Data WarehouseyesParallel Data WarehouseParallel Data WarehouseAnwendungsbereich:Applies to: JaSQL ServerSQL Server (alle unterstützten Versionen) yesSQL ServerSQL Server (all supported versions) JaAzure SQL-DatenbankAzure SQL DatabaseYesAzure SQL-DatenbankAzure SQL Database JaVerwaltete Azure SQL-InstanzAzure SQL Managed InstanceYesVerwaltete Azure SQL-InstanzAzure SQL Managed Instance JaAzure Synapse AnalyticsAzure Synapse AnalyticsyesAzure Synapse AnalyticsAzure Synapse Analytics JaParallel Data WarehouseParallel Data WarehouseyesParallel Data WarehouseParallel Data Warehouse

Mit SELECT…INTO wird eine neue Tabelle in der Standarddateigruppe erstellt, und die Ergebniszeilen aus der Abfrage werden darin eingefügt.SELECT...INTO creates a new table in the default filegroup and inserts the resulting rows from the query into it. Die vollständige SELECT-Syntax finden Sie unter SELECT (Transact-SQL).To view the complete SELECT syntax, see SELECT (Transact-SQL).

Symbol für Themenlink Transact-SQL-SyntaxkonventionenTopic link icon Transact-SQL Syntax Conventions

SyntaxSyntax

[ INTO new_table ]
[ ON filegroup ]

Hinweis

Informationen zum Anzeigen der Transact-SQL-Syntax für SQL Server 2014 oder früher finden Sie unter Dokumentation zu früheren Versionen.To view Transact-SQL syntax for SQL Server 2014 and earlier, see Previous versions documentation.

ArgumenteArguments

new_table new_table
Gibt den Namen einer neuen Tabelle an, die mithilfe der Spalten in der Auswahlliste und der aus der Datenquelle ausgewählten Zeilen erstellt wird.Specifies the name of a new table to be created, based on the columns in the select list and the rows chosen from the data source.

Das Format von new_table wird bestimmt, indem die Ausdrücke in der Auswahlliste ausgewertet werden.The format of new_table is determined by evaluating the expressions in the select list. Die Spalten in new_table werden in der durch die Auswahlliste angegebenen Reihenfolge erstellt.The columns in new_table are created in the order specified by the select list. Jede Spalte in new_table besitzt den gleichen Namen, Datentyp, NULL-Zulässigkeit und Wert wie der entsprechende Ausdruck in der Auswahlliste.Each column in new_table has the same name, data type, nullability, and value as the corresponding expression in the select list. Die IDENTITY-Eigenschaft einer Spalte wird übertragen. Dies gilt mit Ausnahme der unter "Arbeiten mit Identitätsspalten" im Abschnitt "Hinweise" angegebenen Bedingungen.The IDENTITY property of a column is transferred except under the conditions defined in "Working with Identity Columns" in the Remarks section.

Um die Tabelle in einer anderen Datenbank für die gleiche Instanz von SQL ServerSQL Server zu erstellen, geben Sie new_table als vollqualifizierten Namen in der Form database.schema.table_name an.To create the table in another database on the same instance of SQL ServerSQL Server, specify new_table as a fully qualified name in the form database.schema.table_name.

new_table kann nicht für einen Remoteserver erstellt werden; Sie können new_table jedoch anhand einer Remotedatenquelle auffüllen.You cannot create new_table on a remote server; however, you can populate new_table from a remote data source. Um new_table anhand einer Remotequelltabelle zu erstellen, geben Sie die Quelltabelle als vierteiligen Namen in der Form linked_server.catalog.schema.object in der FROM-Klausel der SELECT-Anweisung an.To create new_table from a remote source table, specify the source table using a four-part name in the form linked_server.catalog.schema.object in the FROM clause of the SELECT statement. Alternativ können Sie die OPENQUERY-Funktion oder die OPENDATASOURCE-Funktion in der FROM-Klausel verwenden, um die Remotedatenquelle anzugeben.Alternatively, you can use the OPENQUERY function or the OPENDATASOURCE function in the FROM clause to specify the remote data source.

filegroup filegroup
Gibt den Namen der Dateigruppe an, in der die neue Tabelle erstellt wird.Specifies the name of the filegroup in which new table will be created. Die angegebene Dateigruppe muss in der Datenbank vorhanden sein, andernfalls löst die SQL Server-Engine einen Fehler aus.The filegroup specified should exist on the database else the SQL Server engine throws an error.

Anwendungsbereich: SQL Server 2016 (13.x)SQL Server 2016 (13.x) SP2 und höher.Applies to: SQL Server 2016 (13.x)SQL Server 2016 (13.x) SP2 and later.

DatentypenData Types

Beim FILESTREAM-Attribut werden keine Daten in die neue Tabelle übertragen.The FILESTREAM attribute does not transfer to the new table. FILESTREAM-BLOBs werden kopiert und in der neuen Tabelle als varbinary(max) -BLOBs gespeichert.FILESTREAM BLOBs are copied and stored in the new table as varbinary(max) BLOBs. Ohne das FILESTREAM-Attribut verfügt der varbinary(max) -Datentyp über eine Einschränkung von 2 GB.Without the FILESTREAM attribute, the varbinary(max) data type has a limitation of 2 GB. Wenn ein FILESTREAM-BLOB diesen Wert überschreitet, wird Fehler 7119 ausgelöst, und die Anweisung wird beendet.If a FILESTREAM BLOB exceeds this value, error 7119 is raised and the statement is stopped.

Bei der Auswahl einer vorhandenen Identitätsspalte in einer neuen Tabelle erbt die neue Spalte die IDENTITY-Eigenschaft, es sein denn, eine der folgenden Bedingungen trifft zu:When an existing identity column is selected into a new table, the new column inherits the IDENTITY property, unless one of the following conditions is true:

  • Die SELECT-Anweisung enthält einen Join.The SELECT statement contains a join.

  • Mehrere SELECT-Anweisungen sind mit UNION verknüpft.Multiple SELECT statements are joined by using UNION.

  • Die Identitätsspalte ist mehrfach in der Auswahlliste aufgeführt.The identity column is listed more than one time in the select list.

  • Die Identitätsspalte ist Teil eines Ausdrucks.The identity column is part of an expression.

  • Die Identitätsspalte stammt aus einer Remotedatenquelle.The identity column is from a remote data source.

Falls eine dieser Bedingungen erfüllt ist, wird die Spalte mit NOT NULL erstellt, anstatt die IDENTITY-Eigenschaft zu erben.If any one of these conditions is true, the column is created NOT NULL instead of inheriting the IDENTITY property. Wenn eine Identitätsspalte in der neuen Tabelle erforderlich, aber nicht verfügbar ist oder wenn Sie einen Ausgangs- oder Inkrementwert benötigen, der sich von der Quellidentitätsspalte unterscheidet, definieren Sie die Spalte in der Auswahlliste mithilfe der IDENTITY-Funktion.If an identity column is required in the new table but such a column is not available, or you want a seed or increment value that is different than the source identity column, define the column in the select list using the IDENTITY function. Weitere Informationen finden Sie unter "Erstellen einer Identitätsspalte mithilfe der IDENTITY-Funktion" im Abschnitt mit den Beispielen unten.See "Creating an identity column using the IDENTITY function" in the Examples section below.

BemerkungenRemarks

Die SELECT...INTO-Anweisung wird in zwei Schritten ausgeführt: Zunächst wird die neue Tabelle erstellt, dann werden die Zeilen eingefügt.The SELECT...INTO statement operates in two parts - the new table is created, and then rows are inserted. Das bedeutet, dass ein Rollback ausgeführt wird, wenn die Einfügevorgänge fehlschlagen; die neue (leere) Tabelle bleibt jedoch bestehen.This means that if the inserts fail, they will all be rolled back, but the new (empty) table will remain. Wenn der gesamte Vorgang als Ganzes erfolgreich sein oder fehlschlagen muss, verwenden Sie eine explizite Transaktion.If you need the entire operation to succeed or fail as a whole, use an explicit transaction.

EinschränkungenLimitations and Restrictions

Tabellenvariablen und Tabellenwertparameter können nicht als neue Tabelle angegeben werden.You cannot specify a table variable or table-valued parameter as the new table.

Sie können mit SELECT...INTO keine partitionierte Tabelle erstellen, auch dann nicht, wenn die Quelltabelle partitioniert ist.You cannot use SELECT...INTO to create a partitioned table, even when the source table is partitioned. Für SELECT...INTO wird nicht das Partitionsschema der Quelltabelle verwendet. Stattdessen wird die neue Tabelle in der Standarddateigruppe erstellt.SELECT...INTO does not use the partition scheme of the source table; instead, the new table is created in the default filegroup. Erstellen Sie zum Einfügen von Zeilen in eine partitionierte Tabelle zuerst die partitionierte Tabelle, und verwenden Sie anschließend die INSERT INTO...SELECT...FROM-Anweisung.To insert rows into a partitioned table, you must first create the partitioned table and then use the INSERT INTO...SELECT...FROM statement.

Indizes, Einschränkungen und Trigger, die in der Quelltabelle definiert wurden, werden nicht in die neue Tabelle übertragen. Sie können auch nicht in der SELECT...INTO-Anweisung angegeben werden.Indexes, constraints, and triggers defined in the source table are not transferred to the new table, nor can they be specified in the SELECT...INTO statement. Wenn diese Objekte erforderlich sind, können Sie sie nach dem Ausführen der SELECT...INTO-Anweisung erstellen.If these objects are required, you can create them after executing the SELECT...INTO statement.

Die Angabe einer ORDER BY-Klausel gewährleistet nicht, dass die Zeilen in der angegebenen Reihenfolge eingefügt werden.Specifying an ORDER BY clause does not guarantee the rows are inserted in the specified order.

Wenn eine Sparsespalte in die Auswahlliste eingeschlossen ist, wird die Eigenschaft der Sparsespalte nicht an die neue Tabelle übertragen.When a sparse column is included in the select list, the sparse column property does not transfer to the column in the new table. Wenn diese Eigenschaft in der neuen Tabelle erforderlich ist, ändern Sie die Spaltendefinition, nachdem Sie die SELECT...INTO-Anweisung ausgeführt haben, um diese Eigenschaft einzuschließen.If this property is required in the new table, alter the column definition after executing the SELECT...INTO statement to include this property.

Wenn eine berechnete Spalte in die Auswahlliste eingeschlossen ist, ist die entsprechende Spalte in der neuen Tabelle keine berechnete Spalte.When a computed column is included in the select list, the corresponding column in the new table is not a computed column. Die Werte in der neuen Spalte entsprechen den Werten, die zum Zeitpunkt der Ausführung der SELECT...INTO-Anweisung berechnet wurden.The values in the new column are the values that were computed at the time SELECT...INTO was executed.

ProtokollierungsverhaltenLogging Behavior

Der Grad der Protokollierung für SELECT...INTO hängt von dem Wiederherstellungsmodell ab, das für die Datenbank aktiv ist.The amount of logging for SELECT...INTO depends on the recovery model in effect for the database. Unter dem einfachen Wiederherstellungsmodell und dem massenprotokollierten Wiederherstellungsmodell werden Massenvorgänge minimal protokolliert.Under the simple recovery model or bulk-logged recovery model, bulk operations are minimally logged. Bei minimaler Protokollierung kann es effizienter sein, die SELECT...INTO-Anweisung zu verwenden, anstatt eine Tabelle zu erstellen und diese dann mithilfe einer INSERT-Anweisung aufzufüllen.With minimal logging, using the SELECT...INTO statement can be more efficient than creating a table and then populating the table with an INSERT statement. Weitere Informationen finden Sie unter Das Transaktionsprotokoll (SQL Server).For more information, see The Transaction Log (SQL Server).

SELECT...INTO-Anweisungen, die benutzerdefinierte Funktionen (UDFs) enthalten, sind vollständig protokollierte Vorgänge.SELECT...INTO statements that contain user-defined functions (UDFs) are fully logged operations. Wenn die benutzerdefinierten Funktionen, die in der SELECT...INTO-Anweisung verwendet werden, keine Datenzugriffsvorgänge ausführen, können Sie die SCHEMABINDING-Klausel für die benutzerdefinierten Funktionen angeben. Dadurch wird die abgeleitete UserDataAccess-Eigenschaft für diese benutzerdefinierten Funktionen auf 0 (Null) festgelegt.If the user-defined functions that are used in the SELECT...INTO statement don't perform any data access operations, you can specify the SCHEMABINDING clause for the user-defined functions, which will set the derived UserDataAccess property for those user-defined functions to 0. Nach dieser Änderung werden SELECT...INTO-Anweisungen minimal protokolliert.After this change, SELECT...INTO statements will be minimally logged. Wenn die SELECT...INTO-Anweisung weiterhin auf mindestens eine benutzerdefinierte Funktion verweist, bei der diese Eigenschaft auf 1 festgelegt ist, wird der Vorgang vollständig protokolliert.If the SELECT...INTO statement still references at least one user-defined function that has this property set to 1, the operation is fully logged.

BerechtigungenPermissions

Erfordert die CREATE TABLE-Berechtigung in der Zieldatenbank.Requires CREATE TABLE permission in the destination database.

BeispieleExamples

A.A. Erstellen einer Tabelle durch Angeben von Spalten aus mehreren QuellenCreating a table by specifying columns from multiple sources

Im folgenden Beispiel wird die dbo.EmployeeAddresses-Tabelle in der AdventureWorks2012AdventureWorks2012-Datenbank erstellt, indem sieben Spalten aus verschiedenen mitarbeiter- und adressbezogenen Tabellen ausgewählt werden.The following example creates the table dbo.EmployeeAddresses in the AdventureWorks2012AdventureWorks2012 database by selecting seven columns from various employee-related and address-related tables.

SELECT c.FirstName, c.LastName, e.JobTitle, a.AddressLine1, a.City,   
    sp.Name AS [State/Province], a.PostalCode  
INTO dbo.EmployeeAddresses  
FROM Person.Person AS c  
    JOIN HumanResources.Employee AS e   
    ON e.BusinessEntityID = c.BusinessEntityID  
    JOIN Person.BusinessEntityAddress AS bea  
    ON e.BusinessEntityID = bea.BusinessEntityID  
    JOIN Person.Address AS a  
    ON bea.AddressID = a.AddressID  
    JOIN Person.StateProvince as sp   
    ON sp.StateProvinceID = a.StateProvinceID;  
GO  

B.B. Einfügen von Zeilen bei minimaler ProtokollierungInserting rows using minimal logging

Im folgenden Beispiel wird die dbo.NewProducts-Tabelle erstellt, und Zeilen aus der Production.Product-Tabelle werden eingefügt.The following example creates the table dbo.NewProducts and inserts rows from the Production.Product table. Im Beispiel wird davon ausgegangen, dass das Wiederherstellungsmodell der AdventureWorks2012AdventureWorks2012-Datenbank auf FULL festgelegt wird.The example assumes that the recovery model of the AdventureWorks2012AdventureWorks2012 database is set to FULL. Um sicherzustellen, dass die minimale Protokollierung verwendet wird, wird das Wiederherstellungsmodell der AdventureWorks2012AdventureWorks2012-Datenbank auf BULK_LOGGED festgelegt, bevor Zeilen eingefügt und nach der SELECT...INTO-SELECT-Anweisung auf FULL zurückgesetzt werden.To ensure minimal logging is used, the recovery model of the AdventureWorks2012AdventureWorks2012 database is set to BULK_LOGGED before rows are inserted and reset to FULL after the SELECT...INTO statement. Dadurch wird sichergestellt, dass die SELECT…INTO-Anweisung minimalen Speicherplatz im Transaktionsprotokoll belegt und effektiv ausgeführt wird.This process ensures that the SELECT...INTO statement uses minimal space in the transaction log and performs efficiently.

ALTER DATABASE AdventureWorks2012 SET RECOVERY BULK_LOGGED;  
GO  
  
SELECT * INTO dbo.NewProducts  
FROM Production.Product  
WHERE ListPrice > $25   
AND ListPrice < $100;  
GO  
ALTER DATABASE AdventureWorks2012 SET RECOVERY FULL;  
GO  

C.C. Erstellen einer Identitätsspalte mithilfe der IDENTITY-FunktionCreating an identity column using the IDENTITY function

Im folgenden Beispiel wird die IDENTITY-Funktion verwendet, um eine Identitätsspalte in der neuen Person.USAddress-Tabelle der AdventureWorks2012AdventureWorks2012-Datenbank zu erstellen.The following example uses the IDENTITY function to create an identity column in the new table Person.USAddress in the AdventureWorks2012AdventureWorks2012 database. Dies ist erforderlich, da die SELECT-Anweisung, durch die die Tabelle definiert wird, einen Join enthält. Dieser Join bewirkt, dass die IDENTITY-Eigenschaft nicht an die neue Tabelle übertragen wird.This is required because the SELECT statement that defines the table contains a join, which causes the IDENTITY property to not transfer to the new table. Beachten Sie, dass sich der in der IDENTITY-Funktion angegebene Ausgangs- und Inkrementwert von dem der AddressID-Spalte in der Person.Address-Quelltabelle unterscheidet.Notice that the seed and increment values specified in the IDENTITY function are different from those of the AddressID column in the source table Person.Address.

-- Determine the IDENTITY status of the source column AddressID.  
SELECT OBJECT_NAME(object_id) AS TableName, name AS column_name, 
  is_identity, seed_value, increment_value  
FROM sys.identity_columns  
WHERE name = 'AddressID';  
  
-- Create a new table with columns from the existing table Person.Address. 
-- A new IDENTITY column is created by using the IDENTITY function.  
SELECT IDENTITY (int, 100, 5) AS AddressID,   
       a.AddressLine1, a.City, b.Name AS State, a.PostalCode  
INTO Person.USAddress   
FROM Person.Address AS a  
INNER JOIN Person.StateProvince AS b 
  ON a.StateProvinceID = b.StateProvinceID  
WHERE b.CountryRegionCode = N'US';   
  
-- Verify the IDENTITY status of the AddressID columns in both tables.  
SELECT OBJECT_NAME(object_id) AS TableName, name AS column_name, 
  is_identity, seed_value, increment_value  
FROM sys.identity_columns  
WHERE name = 'AddressID';  

D:D. Erstellen einer Tabelle durch Angeben von Spalten aus einer RemotedatenquelleCreating a table by specifying columns from a remote data source

Im folgenden Beispiel werden drei Methoden beschrieben, um eine neue Tabelle für den lokalen Server von einer Remotedatenquelle aus zu erstellen.The following example demonstrates three methods of creating a new table on the local server from a remote data source. Zunächst wird im Beispiel ein Link zur Remotedatenquelle erstellt.The example begins by creating a link to the remote data source. Der Name des Verbindungsservers MyLinkServer, wird dann in der FROM-Klausel der ersten SELECT...INTO-Anweisung und der OPENQUERY-Funktion der zweiten SELECT...INTO-Anweisung angegeben.The linked server name, MyLinkServer, is then specified in the FROM clause of the first SELECT...INTO statement and in the OPENQUERY function of the second SELECT...INTO statement. Die dritte SELECT...INTO-Anweisung verwendet die OPENDATASOURCE-Funktion, die die Remotedatenquelle direkt angibt, anstatt den Namen des Verbindungsservers zu verwenden.The third SELECT...INTO statement uses the OPENDATASOURCE function, which specifies the remote data source directly instead of using the linked server name.

Gilt für: SQL Server 2008SQL Server 2008 und höher.Applies to: SQL Server 2008SQL Server 2008 and later.

USE master;  
GO  
-- Create a link to the remote data source.   
-- Specify a valid server name for @datasrc as 'server_name' 
-- or 'server_name\instance_name'.  
EXEC sp_addlinkedserver @server = N'MyLinkServer',  
    @srvproduct = N' ',  
    @provider = N'SQLNCLI',   
    @datasrc = N'server_name',  
    @catalog = N'AdventureWorks2012';  
GO  

USE AdventureWorks2012;  
GO  
-- Specify the remote data source in the FROM clause using a four-part name   
-- in the form linked_server.catalog.schema.object.  
SELECT DepartmentID, Name, GroupName, ModifiedDate  
INTO dbo.Departments  
FROM MyLinkServer.AdventureWorks2012.HumanResources.Department  
GO  
-- Use the OPENQUERY function to access the remote data source.  
SELECT DepartmentID, Name, GroupName, ModifiedDate  
INTO dbo.DepartmentsUsingOpenQuery  
FROM OPENQUERY(MyLinkServer, 'SELECT *  
               FROM AdventureWorks2012.HumanResources.Department');   
GO  
-- 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_name\instance_name.  
SELECT DepartmentID, Name, GroupName, ModifiedDate  
INTO dbo.DepartmentsUsingOpenDataSource  
FROM OPENDATASOURCE('SQLNCLI',  
    'Data Source=server_name;Integrated Security=SSPI')  
    .AdventureWorks2012.HumanResources.Department;  
GO  

E.E. Importieren aus einer externen mit PolyBase erstellten TabelleImport from an external table created with PolyBase

Importieren Sie Daten aus Hadoop oder Azure Storage in SQL Server für den beständigen Speicher.Import data from Hadoop or Azure Storage into SQL Server for persistent storage. Verwenden Sie SELECT INTO, um Daten, auf die eine externe Tabelle verweist, zu importieren und dauerhaft in SQL Server zu speichern.Use SELECT INTO to import data referenced by an external table for persistent storage in SQL Server. Erstellen Sie dynamisch eine relationale Tabelle, und erstellen Sie dann in einem zweiten Schritt einen Columnstore-Index über die Tabelle.Create a relational table on-the-fly and then create a column-store index on top of the table in a second step.

Gilt für: SQL Server 2019 (15.x)SQL Server 2019 (15.x)Applies to: SQL Server 2019 (15.x)SQL Server 2019 (15.x).

-- Import data for car drivers into SQL Server to do more in-depth analysis.  
SELECT DISTINCT   
        Insured_Customers.FirstName, Insured_Customers.LastName,   
        Insured_Customers.YearlyIncome, Insured_Customers.MaritalStatus  
INTO Fast_Customers from Insured_Customers INNER JOIN   
(  
        SELECT * FROM CarSensor_Data where Speed > 35   
) AS SensorD  
ON Insured_Customers.CustomerKey = SensorD.CustomerKey  
ORDER BY YearlyIncome;  

F.F. Erstellen einer neuen Tabelle als Kopie einer anderen Tabelle und Laden der Tabelle in eine angegebene DateigruppeCreating a new table as a copy of another table and loading it a specified filegroup

Das folgende Beispiel zeigt, wie eine neue Tabelle als Kopie einer anderen Tabelle erstellt und in eine angegebene Dateigruppe geladen wird, bei der es sich nicht um die Standarddateigruppe des Benutzers handelt.The following example demonstrates creating a new table as a copy of another table and loading it into a specified filegroup different from the default filegroup of the user.

Anwendungsbereich: SQL Server 2016 (13.x)SQL Server 2016 (13.x) SP2 und höher.Applies to: SQL Server 2016 (13.x)SQL Server 2016 (13.x) SP2 and later.

ALTER DATABASE [AdventureWorksDW2016] ADD FILEGROUP FG2;
ALTER DATABASE [AdventureWorksDW2016]
ADD FILE
(
NAME='FG2_Data',
FILENAME = '/var/opt/mssql/data/AdventureWorksDW2016_Data1.mdf'
)
TO FILEGROUP FG2;
GO
SELECT * INTO [dbo].[FactResellerSalesXL] ON FG2 FROM [dbo].[FactResellerSales];

Weitere InformationenSee Also

SELECT (Transact-SQL) SELECT (Transact-SQL)
Beispiele für SELECT (Transact-SQL) SELECT Examples (Transact-SQL)
INSERT (Transact-SQL) INSERT (Transact-SQL)
IDENTITY (Funktion) (Transact-SQL)IDENTITY (Function) (Transact-SQL)