SELECT - INTO-Klausel (Transact-SQL)

Gilt für: SQL Server Azure SQL-Datenbank Azure SQL verwaltete Instanz Azure Synapse Analytics Platform System (PDW) Warehouse in Microsoft Fabric

Mit SELECT…INTO wird eine neue Tabelle in der Standarddateigruppe erstellt, und die Ergebniszeilen aus der Abfrage werden darin eingefügt. Die vollständige SELECT-Syntax finden Sie unter SELECT (Transact-SQL).

Transact-SQL-Syntaxkonventionen

Syntax

[ INTO new_table ]
[ ON filegroup ]

Argumente

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.

Das Format von new_table wird bestimmt, indem die Ausdrücke in der Auswahlliste ausgewertet werden. Die Spalten in new_table werden in der durch die Auswahlliste angegebenen Reihenfolge erstellt. Jede Spalte in new_table besitzt den gleichen Namen, Datentyp, NULL-Zulässigkeit und Wert wie der entsprechende Ausdruck in der Auswahlliste. Die IDENTITY-Eigenschaft einer Spalte wird übertragen. Dies gilt mit Ausnahme der unter "Arbeiten mit Identitätsspalten" im Abschnitt "Hinweise" angegebenen Bedingungen.

Um die Tabelle in einer anderen Datenbank für die gleiche Instanz von SQL Server zu erstellen, geben Sie new_table als vollqualifizierten Namen in der Form database.schema.table_name an.

new_table kann nicht für einen Remoteserver erstellt werden; Sie können new_table jedoch anhand einer Remotedatenquelle auffüllen. 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. Alternativ können Sie die OPENQUERY-Funktion oder die OPENDATASOURCE-Funktion in der FROM-Klausel verwenden, um die Remotedatenquelle anzugeben.

filegroup
Gibt den Namen der Dateigruppe an, in der die neue Tabelle erstellt wird. Die angegebene Dateigruppe muss in der Datenbank vorhanden sein, andernfalls löst die SQL Server-Engine einen Fehler aus.

Anwendungsbereich: SQL Server 2016 (13.x) SP2 und höher.

Datentypen

Beim FILESTREAM-Attribut werden keine Daten in die neue Tabelle übertragen. FILESTREAM-BLOBs werden kopiert und in der neuen Tabelle als varbinary(max) -BLOBs gespeichert. Ohne das FILESTREAM-Attribut verfügt der varbinary(max) -Datentyp über eine Einschränkung von 2 GB. Wenn ein FILESTREAM-BLOB diesen Wert überschreitet, wird Fehler 7119 ausgelöst, und die Anweisung wird beendet.

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:

  • Die SELECT-Anweisung enthält einen Join.

  • Mehrere SELECT-Anweisungen sind mit UNION verknüpft.

  • Die Identitätsspalte ist mehrfach in der Auswahlliste aufgeführt.

  • Die Identitätsspalte ist Teil eines Ausdrucks.

  • Die Identitätsspalte stammt aus einer Remotedatenquelle.

Falls eine dieser Bedingungen erfüllt ist, wird die Spalte mit NOT NULL erstellt, anstatt die IDENTITY-Eigenschaft zu erben. 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. Weitere Informationen finden Sie unter "Erstellen einer Identitätsspalte mithilfe der IDENTITY-Funktion" im Abschnitt mit den Beispielen unten.

Bemerkungen

Die SELECT...INTO-Anweisung wird in zwei Schritten ausgeführt: Zunächst wird die neue Tabelle erstellt, dann werden die Zeilen eingefügt. Das bedeutet, dass ein Rollback ausgeführt wird, wenn die Einfügevorgänge fehlschlagen; die neue (leere) Tabelle bleibt jedoch bestehen. Wenn der gesamte Vorgang als Ganzes erfolgreich sein oder fehlschlagen muss, verwenden Sie eine explizite Transaktion.

Warehouse in Microsoft Fabric unterstützt keine Dateigruppen. Beispiele und Verweise auf Dateigruppen in diesem Artikel gelten nicht für Warehouse in Microsoft Fabric.

Einschränkungen

Tabellenvariablen und Tabellenwertparameter können nicht als neue Tabelle angegeben werden.

Sie können mit SELECT...INTO keine partitionierte Tabelle erstellen, auch dann nicht, wenn die Quelltabelle partitioniert ist. Für SELECT...INTO wird nicht das Partitionsschema der Quelltabelle verwendet. Stattdessen wird die neue Tabelle in der Standarddateigruppe erstellt. 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.

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. Wenn diese Objekte erforderlich sind, können Sie sie nach dem Ausführen der SELECT...INTO-Anweisung erstellen.

Die Angabe einer ORDER BY-Klausel gewährleistet nicht, dass die Zeilen in der angegebenen Reihenfolge eingefügt werden.

Wenn eine Sparsespalte in die Auswahlliste eingeschlossen ist, wird die Eigenschaft der Sparsespalte nicht an die neue Tabelle übertragen. 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.

Wenn eine berechnete Spalte in die Auswahlliste eingeschlossen ist, ist die entsprechende Spalte in der neuen Tabelle keine berechnete Spalte. Die Werte in der neuen Spalte entsprechen den Werten, die zum Zeitpunkt der Ausführung der SELECT...INTO-Anweisung berechnet wurden.

Protokollierungsverhalten

Der Grad der Protokollierung für SELECT...INTO hängt von dem Wiederherstellungsmodell ab, das für die Datenbank aktiv ist. Unter dem einfachen Wiederherstellungsmodell und dem massenprotokollierten Wiederherstellungsmodell werden Massenvorgänge minimal protokolliert. 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. Weitere Informationen finden Sie unter Das Transaktionsprotokoll (SQL Server).

SELECT...INTO-Anweisungen, die benutzerdefinierte Funktionen (UDFs) enthalten, sind vollständig protokollierte Vorgänge. 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. Nach dieser Änderung werden SELECT...INTO-Anweisungen minimal protokolliert. 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.

Berechtigungen

Es sind die CREATE TABLE-Berechtigung in der Datenbank und die ALTER-Berechtigung für das Schema erforderlich, in der die Tabelle erstellt wird.

Beispiele

A. Erstellen einer Tabelle durch Angeben von Spalten aus mehreren Quellen

Im folgenden Beispiel wird die Tabelle dbo.EmployeeAddresses in der AdventureWorks2022-Datenbank erstellt, indem sieben Spalten aus verschiedenen mitarbeiter- und adressbezogenen Tabellen ausgewählt werden.

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. Einfügen von Zeilen bei minimaler Protokollierung

Im folgenden Beispiel wird die dbo.NewProducts-Tabelle erstellt, und Zeilen aus der Production.Product-Tabelle werden eingefügt. Im Beispiel wird davon ausgegangen, dass das Wiederherstellungsmodell der AdventureWorks2022-Datenbank auf FULL festgelegt ist. Um die Verwendung der minimalen Protokollierung sicherzustellen, wird das Wiederherstellungsmodell der AdventureWorks2022-Datenbank vor dem Einfügen von Zeilen auf BULK_LOGGED festgelegt und nach der SELECT...INTO-SELECT-Anweisung wieder auf FULL zurückgesetzt. Dadurch wird sichergestellt, dass die SELECT…INTO-Anweisung minimalen Speicherplatz im Transaktionsprotokoll belegt und effektiv ausgeführt wird.

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

C. Erstellen einer Identitätsspalte mithilfe der IDENTITY-Funktion

Im folgenden Beispiel wird die IDENTITY-Funktion verwendet, um eine Identitätsspalte in der neuen Tabelle Person.USAddress der AdventureWorks2022-Datenbank zu erstellen. 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. Beachten Sie, dass sich der in der IDENTITY-Funktion angegebene Ausgangs- und Inkrementwert von dem der AddressID-Spalte in der Person.Address-Quelltabelle unterscheidet.

-- 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: Erstellen einer Tabelle durch Angeben von Spalten aus einer Remotedatenquelle

Im folgenden Beispiel werden drei Methoden beschrieben, um eine neue Tabelle für den lokalen Server von einer Remotedatenquelle aus zu erstellen. Zunächst wird im Beispiel ein Link zur Remotedatenquelle erstellt. 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. Die dritte SELECT...INTO-Anweisung verwendet die OPENDATASOURCE-Funktion, die die Remotedatenquelle direkt angibt, anstatt den Namen des Verbindungsservers zu verwenden.

Gilt für: SQL Server 2008 (10.0.x) und höher

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'AdventureWorks2022';  
GO  

USE AdventureWorks2022;  
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.AdventureWorks2022.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 AdventureWorks2022.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')  
    .AdventureWorks2022.HumanResources.Department;  
GO  

E. Importieren aus einer externen mit PolyBase erstellten Tabelle

Importieren Sie Daten aus Hadoop oder Azure Storage in SQL Server für den beständigen Speicher. Verwenden Sie SELECT INTO, um Daten, auf die eine externe Tabelle verweist, zu importieren und dauerhaft in SQL Server zu speichern. Erstellen Sie dynamisch eine relationale Tabelle, und erstellen Sie dann in einem zweiten Schritt einen Columnstore-Index über die Tabelle.

Gilt für: SQL Server

-- 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. Kopieren der Daten aus einer der Tabellen in eine andere und Erstellen der neuen Tabelle in einer angegebenen Dateigruppe

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.

Anwendungsbereich: SQL Server 2016 (13.x) SP2 und höher.

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

Weitere Informationen

SELECT (Transact-SQL)
SELECT-Beispiele (Transact-SQL)
INSERT (Transact-SQL)
IDENTITY (Funktion) (Transact-SQL)