Udostępnij za pomocą


SELECT — INTO, klauzula (Transact-SQL)

Dotyczy:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics Platform System (PDW)Magazyn w usłudze Microsoft FabricBaza danych SQL w usłudze Microsoft Fabric

WYBRAĆ... FUNKCJA INTO tworzy nową tabelę w domyślnej grupie plików i wstawia do niej wynikowe wiersze z zapytania. Aby wyświetlić pełną składnię SELECT, zobacz SELECT (Transact-SQL).

Transact-SQL konwencje składni

Syntax

[ INTO new_table ]
[ ON filegroup ]

Arguments

new_table
Określa nazwę nowej tabeli do utworzenia na podstawie kolumn na liście wyboru i wierszy wybranych ze źródła danych.

Format new_table jest określany przez ocenę wyrażeń na liście wyboru. Kolumny w new_table są tworzone w kolejności określonej przez listę wyboru. Każda kolumna w new_table ma taką samą nazwę, typ danych, wartość null, jak odpowiednie wyrażenie na liście wyboru. Właściwość IDENTITY kolumny jest przenoszona z wyjątkiem warunków zdefiniowanych w sekcji "Praca z kolumnami tożsamości".

Aby utworzyć tabelę w innej bazie danych w tym samym wystąpieniu programu SQL Server, określ new_table jako w pełni kwalifikowaną nazwę w formularzu database.schema.table_name.

Nie można utworzyć new_table na serwerze zdalnym; można jednak wypełnić new_table ze zdalnego źródła danych. Aby utworzyć new_table na podstawie zdalnej tabeli źródłowej, określ tabelę źródłową przy użyciu czteroczęściowej nazwy w formularzu linked_server. wykaz. schemat. obiekt w klauzuli FROM instrukcji SELECT. Alternatywnie można użyć funkcji OPENQUERY lub funkcji OPENDATASOURCE w klauzuli FROM, aby określić zdalne źródło danych.

grupa plików
Określa nazwę grupy plików, w której zostanie utworzona nowa tabela. Określona grupa plików powinna istnieć w bazie danych, w przeciwnym razie aparat programu SQL Server zgłasza błąd.

Dotyczy: SQL Server 2016 (13.x) SP2 lub nowszy.

Typy danych

Atrybut FILESTREAM nie jest przenoszony do nowej tabeli. BLOB FILESTREAM są kopiowane i przechowywane w nowej tabeli jako BLOB varbinary(max). Bez atrybutu FILESTREAM typ danych varbinary(max) ma ograniczenie 2 GB. Jeśli obiekt BLOB FILESTREAM przekracza tę wartość, zostanie zgłoszony błąd 7119 i instrukcja zostanie zatrzymana.

Po wybraniu istniejącej kolumny tożsamości do nowej tabeli nowa kolumna dziedziczy właściwość IDENTITY, chyba że spełniony jest jeden z następujących warunków:

  • Instrukcja SELECT zawiera sprzężenie.

  • Wiele instrukcji SELECT jest połączonych przy użyciu instrukcji UNION.

  • Kolumna tożsamości jest wyświetlana więcej niż raz na liście wyboru.

  • Kolumna tożsamości jest częścią wyrażenia.

  • Kolumna tożsamości pochodzi ze zdalnego źródła danych.

Jeśli którykolwiek z tych warunków jest spełniony, kolumna nie jest tworzona bez wartości NULL zamiast dziedziczyć właściwość IDENTITY. Jeśli kolumna tożsamości jest wymagana w nowej tabeli, ale taka kolumna jest niedostępna, lub chcesz, aby wartość inicjacji lub przyrostu różniła się od kolumny tożsamości źródłowej, zdefiniuj kolumnę na liście wyboru przy użyciu funkcji IDENTITY. Zobacz sekcję "Tworzenie kolumny tożsamości przy użyciu funkcji IDENTITY" w poniższej sekcji Przykłady.

Remarks

Instrukcja SELECT...INTO działa w dwóch częściach — zostanie utworzona nowa tabela, a następnie wstawione wiersze. Oznacza to, że jeśli wstawianie zakończy się niepowodzeniem, wszystkie zostaną wycofane, ale nowa (pusta) tabela pozostanie. Jeśli potrzebujesz całej operacji, aby zakończyć się powodzeniem lub niepowodzeniem w całości, użyj jawnej transakcji.

Magazyn w usłudze Microsoft Fabric nie obsługuje grup plików. Odwołania i przykłady w tym artykule do grup plików nie mają zastosowania do magazynu w usłudze Microsoft Fabric.

Ograniczenia i ograniczenia

Nie można określić zmiennej tabeli ani parametru o wartości tabeli jako nowej tabeli.

Nie można użyć SELECT...INTO metody do utworzenia tabeli partycjonowanej, nawet jeśli tabela źródłowa jest partycjonowana. SELECT...INTO nie używa schematu partycji tabeli źródłowej; Zamiast tego nowa tabela jest tworzona w domyślnej grupie plików. Aby wstawić wiersze do tabeli partycjonowanej, musisz najpierw utworzyć tabelę partycjonowaną, a następnie użyć instrukcji INSERT INTO...SELECT...FROM .

Indeksy, ograniczenia i wyzwalacze zdefiniowane w tabeli źródłowej nie są przenoszone do nowej tabeli ani nie można ich określić w instrukcji SELECT...INTO . Jeśli te obiekty są wymagane, można je utworzyć po wykonaniu instrukcji SELECT...INTO .

Określenie klauzuli ORDER BY nie gwarantuje, że wiersze są wstawiane w określonej kolejności.

Gdy kolumna rozrzedzeniu znajduje się na liście zaznaczeń, właściwość kolumny rozrzedzeniu nie jest przenoszona do kolumny w nowej tabeli. Jeśli ta właściwość jest wymagana w nowej tabeli, zmień definicję kolumny po wykonaniu polecenia SELECT... INSTRUKCJA INTO do uwzględnienia tej właściwości.

Gdy kolumna obliczeniowa znajduje się na liście wyboru, odpowiednia kolumna w nowej tabeli nie jest kolumną obliczeniową. Wartości w nowej kolumnie to wartości, które zostały obliczone w czasie SELECT...INTO wykonywania.

Zachowanie logowania

Ilość rejestrowania SELECT...INTO zależy od modelu odzyskiwania obowiązującego dla bazy danych. W ramach prostego modelu odzyskiwania lub modelu odzyskiwania rejestrowanego zbiorczo operacje zbiorcze są minimalnie rejestrowane. W przypadku minimalnego rejestrowania użycie SELECT...INTO instrukcji może być bardziej wydajne niż utworzenie tabeli, a następnie wypełnienie tabeli instrukcją INSERT. Aby uzyskać więcej informacji, zobacz Dziennik transakcji (SQL Server).

SELECT...INTO instrukcje zawierające funkcje zdefiniowane przez użytkownika (UDF) są w pełni rejestrowane operacje. Jeśli funkcje zdefiniowane przez użytkownika, które są używane w SELECT...INTO instrukcji nie wykonują żadnych operacji dostępu do danych, można określić klauzulę SCHEMABINDING dla funkcji zdefiniowanych przez użytkownika, która ustawi pochodną właściwość UserDataAccess dla tych funkcji zdefiniowanych przez użytkownika na 0. Po tej zmianie SELECT...INTO instrukcje zostaną co najmniej zarejestrowane. SELECT...INTO Jeśli instrukcja nadal odwołuje się do co najmniej jednej funkcji zdefiniowanej przez użytkownika, która ma tę właściwość ustawioną na 1, operacja jest w pełni rejestrowana.

Permissions

Wymaga uprawnienia CREATE TABLE w bazie danych i uprawnienia ALTER w schemacie, w którym jest tworzona tabela.

Examples

A. Tworzenie tabeli przez określanie kolumn z wielu źródeł

Poniższy przykład tworzy tabelę dbo.EmployeeAddresses w bazie danych AdventureWorks2025, wybierając siedem kolumn z różnych tabel związanych z pracownikami i adresami.

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. Wstawianie wierszy przy użyciu minimalnego rejestrowania

Poniższy przykład tworzy tabelę dbo.NewProducts i wstawia wiersze z Production.Product tabeli. Przykład zakłada, że model odzyskiwania bazy AdventureWorks2025 jest ustawiony na PEŁNE. Aby zapewnić minimalne logowanie, model odzyskiwania bazy AdventureWorks2025 jest ustawiony tak, aby BULK_LOGGED przed wstawieniem wierszy i resetuje się do FULL po SELECT... Oświadczenie IN. Ten proces gwarantuje, że polecenie SELECT... Instrukcja INTO używa minimalnej ilości miejsca w dzienniku transakcji i działa wydajnie.

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. Tworzenie kolumny tożsamości przy użyciu funkcji IDENTITY

Poniższy przykład wykorzystuje funkcję IDENTITY do utworzenia kolumny tożsamości w nowej tabeli Person.USAddress bazy AdventureWorks2025. Jest to wymagane, ponieważ instrukcja SELECT definiująca tabelę zawiera sprzężenie, co powoduje, że właściwość IDENTITY nie zostanie przeniesiona do nowej tabeli. Zwróć uwagę, że wartości inicjujące i przyrostowe określone w funkcji IDENTITY różnią się od AddressID wartości kolumny w tabeli Person.Addressźródłowej .

-- 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. Tworzenie tabeli przez określenie kolumn z zdalnego źródła danych

W poniższym przykładzie przedstawiono trzy metody tworzenia nowej tabeli na serwerze lokalnym ze zdalnego źródła danych. Przykład rozpoczyna się od utworzenia linku do zdalnego źródła danych. Połączona nazwa MyLinkServer, serwera jest następnie określona w klauzuli FROM pierwszego SELECT... INSTRUKCJA INTO i w funkcji OPENQUERY drugiej funkcji SELECT... INTO, instrukcja. Trzeci wybór... Instrukcja INTO używa funkcji OPENDATASOURCE, która określa zdalne źródło danych bezpośrednio zamiast używać połączonej nazwy serwera.

Dotyczy: SQL Server 2008 (10.0.x) i nowsze.

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. Importowanie z tabeli zewnętrznej utworzonej za pomocą technologii PolyBase

Zaimportuj dane z usługi Hadoop lub Azure Storage do programu SQL Server na potrzeby magazynu trwałego. Służy SELECT INTO do importowania danych przywoływalnych przez tabelę zewnętrzną na potrzeby magazynu trwałego w programie SQL Server. Utwórz tabelę relacyjną na bieżąco, a następnie utwórz indeks magazynu kolumn w górnej części tabeli w drugim kroku.

Dotyczy: 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. Kopiowanie danych z jednej tabeli do innej i tworzenie nowej tabeli w określonej grupie plików

W poniższym przykładzie pokazano utworzenie nowej tabeli jako kopii innej tabeli i załadowanie jej do określonej grupy plików innej niż domyślna grupa plików użytkownika.

Dotyczy: SQL Server 2016 (13.x) SP2 lub nowszy.

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

Zobacz też

WYBIERZ (Transact-SQL)
PRZYKŁADY SELECT (Transact-SQL)
WSTAW (Transact-SQL)
IDENTITY (Funkcja) (Transact-SQL)