Dela via


SELECT – INTO-sats (Transact-SQL)

Gäller för:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalysplattformssystem (PDW)Lager i Microsoft FabricSQL-databas i Förhandsversion av Microsoft Fabric

UTVALD... INTO skapar en ny tabell i standardfilgruppen och infogar de resulterande raderna från frågan i den. Information om hur du visar den fullständiga SELECT-syntaxen finns i SELECT (Transact-SQL).

Transact-SQL syntaxkonventioner

Syntax

[ INTO new_table ]
[ ON filegroup ]

Arguments

new_table
Anger namnet på en ny tabell som ska skapas, baserat på kolumnerna i urvalslistan och de rader som valts från datakällan.

Formatet för new_table bestäms genom att utvärdera uttrycken i urvalslistan. Kolumnerna i new_table skapas i den ordning som anges i urvalslistan. Varje kolumn i new_table har samma namn, datatyp, nullbarhet och värde som motsvarande uttryck i urvalslistan. Identitetsegenskapen för en kolumn överförs förutom under de villkor som definieras i "Arbeta med identitetskolumner" i avsnittet Kommentarer.

Om du vill skapa tabellen i en annan databas på samma instans av SQL Server anger du new_table som ett fullständigt kvalificerat namn i formuläret database.schema.table_name.

Du kan inte skapa new_table på en fjärrserver. Du kan dock fylla i new_table från en fjärrdatakälla. Om du vill skapa new_table från en fjärrkällatabell anger du källtabellen med ett namn i fyra delar i formuläret linked_server. katalog. schema. objektet i FROM-satsen i SELECT-instruktionen. Du kan också använda funktionen OPENQUERY eller funktionen OPENDATASOURCE i FROM-satsen för att ange fjärrdatakällan.

filegroup
Anger namnet på den filgrupp där den nya tabellen ska skapas. Den angivna filgruppen bör finnas i databasen, annars utlöser SQL Server-motorn ett fel.

Gäller för: SQL Server 2016 (13.x) SP2 och senare.

Data Types

Attributet FILESTREAM överförs inte till den nya tabellen. FILESTREAM BLOBs kopieras och lagras i den nya tabellen som varbinary(max) BLOBs. Utan filestream-attributet har datatypen varbinary(max) en begränsning på 2 GB. Om en FILESTREAM-BLOB överskrider det här värdet utlöses fel 7119 och -instruktionen stoppas.

När en befintlig identitetskolumn väljs i en ny tabell ärver den nya kolumnen egenskapen IDENTITY, såvida inte något av följande villkor är sant:

  • SELECT-instruktionen innehåller en koppling.

  • Flera SELECT-instruktioner kopplas med hjälp av UNION.

  • Identitetskolumnen visas mer än en gång i urvalslistan.

  • Identitetskolumnen är en del av ett uttryck.

  • Identitetskolumnen kommer från en fjärrdatakälla.

Om något av dessa villkor är sant skapas kolumnen NOT NULL i stället för att ärva egenskapen IDENTITY. Om en identitetskolumn krävs i den nya tabellen men en sådan kolumn inte är tillgänglig, eller om du vill ha ett startvärde eller ett inkrementsvärde som skiljer sig från källidentitetskolumnen, definierar du kolumnen i listan med hjälp av funktionen IDENTITET. Se "Skapa en identitetskolumn med funktionen IDENTITY" i avsnittet Exempel nedan.

Remarks

-instruktionen SELECT...INTO fungerar i två delar – den nya tabellen skapas och sedan infogas rader. Det innebär att om infogningarna misslyckas kommer alla att återställas, men den nya (tomma) tabellen kommer att finnas kvar. Om du behöver hela åtgärden för att lyckas eller misslyckas som helhet använder du en explicit transaktion.

Lager i Microsoft Fabric stöder inte filgrupper. Referenser och exempel i den här artikeln för filgrupper gäller inte för Warehouse i Microsoft Fabric.

Begränsningar och restriktioner

Du kan inte ange en tabellvariabel eller tabellvärdesparameter som ny tabell.

Du kan inte använda SELECT...INTO för att skapa en partitionerad tabell, även när källtabellen är partitionerad. SELECT...INTO använder inte källtabellens partitionsschema. I stället skapas den nya tabellen i standardfilgruppen. Om du vill infoga rader i en partitionerad tabell måste du först skapa den partitionerade tabellen och sedan använda -instruktionen INSERT INTO...SELECT...FROM .

Index, begränsningar och utlösare som definierats i källtabellen överförs inte till den nya tabellen, och de kan inte heller anges i -instruktionen SELECT...INTO . Om dessa objekt krävs kan du skapa dem när du har kört -instruktionen SELECT...INTO .

Att ange en ORDER BY sats garanterar inte att raderna infogas i den angivna ordningen.

När en gles kolumn ingår i urvalslistan överförs inte den glesa kolumnegenskapen till kolumnen i den nya tabellen. Om den här egenskapen krävs i den nya tabellen ändrar du kolumndefinitionen när du har kört SELECT... INTO-instruktion för att inkludera den här egenskapen.

När en beräknad kolumn ingår i urvalslistan är motsvarande kolumn i den nya tabellen inte en beräknad kolumn. Värdena i den nya kolumnen är de värden som beräknades när den SELECT...INTO kördes.

Logging Behavior

Mängden loggning för SELECT...INTO beror på vilken återställningsmodell som gäller för databasen. Under den enkla återställningsmodellen eller den massloggade återställningsmodellen loggas massåtgärderna minimalt. Med minimal loggning kan det vara effektivare att använda -instruktionen SELECT...INTO än att skapa en tabell och sedan fylla i tabellen med en INSERT-instruktion. Mer information finns i Transaktionsloggen (SQL Server).

SELECT...INTO instruktioner som innehåller användardefinierade funktioner (UDF: er) är helt loggade åtgärder. Om de användardefinierade funktioner som används i -instruktionen SELECT...INTO inte utför några dataåtkomståtgärder kan du ange SCHEMABINDING-satsen för de användardefinierade funktionerna, som anger egenskapen userDataAccess för dessa användardefinierade funktioner till 0. Efter den här ändringen SELECT...INTO loggas instruktioner minimalt. Om instruktionen SELECT...INTO fortfarande refererar till minst en användardefinierad funktion som har den här egenskapen inställd på 1 loggas åtgärden fullständigt.

Permissions

Kräver CREATE TABLE-behörighet i databasen och ALTER-behörighet för schemat där tabellen skapas.

Examples

A. Skapa en tabell genom att ange kolumner från flera källor

I följande exempel skapas tabellen dbo.EmployeeAddresses i databasen AdventureWorks2022 genom att välja sju kolumner från olika medarbetarrelaterade och adressrelaterade tabeller.

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. Infoga rader med minimal loggning

I följande exempel skapas tabellen dbo.NewProducts och rader infogas från Production.Product tabellen. Exemplet förutsätter att återställningsmodellen för databasen AdventureWorks2022 är inställd på FULL. För att säkerställa att minimal loggning används är återställningsmodellen för databasen AdventureWorks2022 inställd på BULK_LOGGED innan raderna infogas och återställs till FULL efter SELECT... INTO-instruktion. Den här processen säkerställer att SELECT... INTO-instruktionen använder minimalt utrymme i transaktionsloggen och presterar effektivt.

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. Skapa en identitetskolumn med funktionen IDENTITY

I följande exempel används funktionen IDENTITY för att skapa en identitetskolumn i den nya tabellen Person.USAddress i databasen AdventureWorks2022. Detta krävs eftersom SELECT-instruktionen som definierar tabellen innehåller en koppling, vilket gör att egenskapen IDENTITY inte överförs till den nya tabellen. Observera att start- och inkrementsvärdena som anges i funktionen IDENTITY skiljer sig från kolumnvärdena AddressID i källtabellen 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. Skapa en tabell genom att ange kolumner från en fjärrdatakälla

I följande exempel visas tre metoder för att skapa en ny tabell på den lokala servern från en fjärrdatakälla. Exemplet börjar med att skapa en länk till fjärrdatakällan. Det länkade servernamnet MyLinkServer, anges sedan i FROM-satsen i den första SELECT... INTO-instruktion och i funktionen OPENQUERY för den andra SELECT... INTO-instruktion. Den tredje SELECT... INTO-instruktionen använder funktionen OPENDATASOURCE, som anger fjärrdatakällan direkt i stället för att använda det länkade servernamnet.

Gäller för: SQL Server 2008 (10.0.x) och senare.

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. Importera från en extern tabell som skapats med PolyBase

Importera data från Hadoop eller Azure Storage till SQL Server för beständig lagring. Används SELECT INTO för att importera data som refereras av en extern tabell för beständig lagring i SQL Server. Skapa en relationstabell direkt och skapa sedan ett kolumnlagringsindex ovanpå tabellen i ett andra steg.

Gäller 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. Kopiera data från en tabell till en annan och skapa den nya tabellen i en angiven filgrupp

I följande exempel visas hur du skapar en ny tabell som en kopia av en annan tabell och läser in den i en angiven filgrupp som skiljer sig från användarens standardfilgrupp.

Gäller för: SQL Server 2016 (13.x) SP2 och senare.

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];

See Also

SELECT (Transact-SQL)
SELECT-exempel (Transact-SQL)
INSERT (Transact-SQL)
Identitet (funktion) (Transact-SQL)