Freigeben über


INTO-Klausel (Transact-SQL)

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

Themenlink (Symbol)Transact-SQL-Syntaxkonventionen

Syntax

[ INTO new_table ]

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.

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 eine Verknüpfung, eine GROUP BY-Klausel oder eine Aggregatfunktion.

  • 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.

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; die neue Tabelle wird stattdessen in der standardmäßigen Dateigruppe erstellt. Um Zeilen in eine partitionierte Tabelle einfügen zu können, müssen Sie zuerst die partitionierte Tabelle erstellen und dann die INSERT INTO…SELECT FROM-Anweisung verwenden.

SELECT...INTO kann nicht zusammen mit COMPUTE verwendet werden.

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, müssen Sie sie nach dem Ausführen der SELECT...INTO-Anweisung erstellen.

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

Wenn eine Spalte mit geringer Dichte in die Auswahlliste eingeschlossen ist, wird die Eigenschaft der Spalte mit geringer Dichte nicht an die neue Tabelle übertragen. Wenn diese Eigenschaft in der neuen Tabelle erforderlich ist, ändern Sie die Spaltendefinition, nachdem Sie die INTO 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 Vorgänge, für die eine minimale Protokollierung verfügbar ist.

Berechtigungen

Erfordert die CREATE TABLE-Berechtigung in der Zieldatenbank.

Beispiele

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

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

USE AdventureWorks2008R2;
GO
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 AdventureWorks2008R2-Datenbank auf FULL festgelegt wird. Um sicherzustellen, dass die minimale Protokollierung verwendet wird, wird das Wiederherstellungsmodell der AdventureWorks2008R2-Datenbank auf BULK_LOGGED festgelegt, bevor Zeilen eingefügt und nach der SELECT...INTO-SELECT-Anweisung auf FULL zurückgesetzt werden. Dadurch wird sichergestellt, dass die SELECT…INTO-Anweisung minimalen Speicherplatz im Transaktionsprotokoll belegt und effektiv ausgeführt wird.

USE AdventureWorks2008R2;
GO
IF OBJECT_ID ('dbo.NewProducts', 'U') IS NOT NULL
    DROP TABLE dbo.NewProducts;
GO
ALTER DATABASE AdventureWorks2008R2 SET RECOVERY BULK_LOGGED;
GO

SELECT * INTO dbo.NewProducts
FROM Production.Product
WHERE ListPrice > $25 
AND ListPrice < $100;
GO
ALTER DATABASE AdventureWorks2008R2 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 Person.USAddress-Tabelle zu erstellen. Dies ist erforderlich, da die SELECT-Anweisung, durch die die Tabelle definiert wird, eine Verknüpfung enthält. Diese Verknüpfung 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.

USE AdventureWorks2008R2;
GO
IF OBJECT_ID ('Person.USAddress') IS NOT NULL
DROP TABLE Person.USAddress;
GO
-- 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.

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