Udostępnij przez


SELECT — KLAUZULA INTO (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

Instrukcja SELECT...INTO tworzy nową tabelę w domyślnej grupie plików i wstawia do niej wynikowe wiersze z zapytania. Aby uzyskać pełną SELECT składnię, zobacz SELECT.

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" w sekcji Uwagi.

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 FROM klauzuli instrukcji SELECT . Alternatywnie można użyć funkcji OPENQUERY lub funkcji OPENDATASOURCE w FROM klauzuli , aby określić zdalne źródło danych.

grupa plików

Określa nazwę grupy plików, w której ma zostać utworzona nowa tabela. Grupa plików musi istnieć w bazie danych lub aparat programu SQL Server zwraca błąd.

Dotyczy: SQL Server 2016 (13.x) SP2 i nowsze.

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 IDENTITY właściwość, chyba że spełniony jest jeden z następujących warunków:

  • Instrukcja SELECT zawiera sprzężenia.
  • Wiele SELECT instrukcji jest dołączanych przy użyciu polecenia 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 zostanie utworzona NOT NULL zamiast dziedziczyć IDENTITY właściwość. Jeśli kolumna tożsamości jest wymagana w nowej tabeli, ale taka kolumna nie jest dostę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 IDENTITY funkcji . Zobacz sekcję "Tworzenie kolumny tożsamości przy użyciu IDENTITY funkcji" w sekcji Przykłady.

Remarks

Instrukcja SELECT...INTO działa w dwóch częściach: nowa tabela jest tworzona, a następnie wstawiane wiersze. Ten dwuetapowy proces oznacza, że jeśli wstawianie zakończy się niepowodzeniem, operacja wycofa wszystkie wstawki, 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

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

Nie można użyć SELECT...INTO polecenia , aby utworzyć tabelę partycjonowaną, 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 potrzebujesz tych obiektów, możesz je utworzyć po wykonaniu instrukcji SELECT...INTO .

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

W przypadku uwzględnienia kolumny rozrzedzeniu na liście zaznaczeń właściwość kolumny rozrzedzeniu nie zostanie przeniesiona do kolumny w nowej tabeli. Jeśli ta właściwość jest potrzebna w nowej tabeli, zmień definicję kolumny po wykonaniu SELECT...INTO instrukcji w celu uwzględnienia tej właściwości.

W przypadku uwzględnienia kolumny obliczeniowej 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 dziennika

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. Przy minimalnym rejestrowaniu SELECT...INTO instrukcja może być wydajniejsza niż tworzenie tabeli, a następnie wypełnianie tabeli instrukcją INSERT . Aby uzyskać więcej informacji, zobacz artykuł dziennika transakcji .

SELECT...INTO instrukcje zawierające funkcje zdefiniowane przez użytkownika (UDF) są w pełni rejestrowane operacje. Jeśli funkcje zdefiniowane przez użytkownika używane przez SELECT...INTO instrukcję nie wykonują żadnych operacji dostępu do danych, możesz określić klauzulę SCHEMABINDING dla funkcji zdefiniowanych przez użytkownika. Ta klauzula ustawia właściwość pochodną UserDataAccess dla tych funkcji zdefiniowanych przez użytkownika na 0wartość . Po tej zmianie SELECT...INTO instrukcje są minimalnie rejestrowane. 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 1wartość , operacja jest w pełni rejestrowana.

Permissions

Wymaga CREATE TABLE uprawnień w bazie danych i ALTER uprawnienia do schematu, w którym jest tworzona tabela.

Examples

A. Utwórz tabelę, określając kolumny 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
     INNER JOIN HumanResources.Employee AS e
         ON e.BusinessEntityID = c.BusinessEntityID
     INNER JOIN Person.BusinessEntityAddress AS bea
         ON e.BusinessEntityID = bea.BusinessEntityID
     INNER JOIN Person.Address AS a
         ON bea.AddressID = a.AddressID
     INNER JOIN Person.StateProvince AS sp
         ON sp.StateProvinceID = a.StateProvinceID;

B. Wstawianie wierszy przy użyciu minimalnego rejestrowania

Poniższy przykład tworzy tabelę dbo.NewProducts i wstawia wiersze z Production.Product tabeli. W przykładzie przyjęto założenie, że model odzyskiwania bazy danych AdventureWorks2025 ma wartość FULL. Aby zapewnić minimalne rejestrowanie, model odzyskiwania bazy danych AdventureWorks2025 jest ustawiony na BULK_LOGGED wartość przed wstawieniem wierszy i resetuje go do FULL po instrukcji SELECT...INTO . Ten proces gwarantuje, że instrukcja SELECT...INTO używa minimalnej ilości miejsca w dzienniku transakcji i działa wydajnie.

ALTER DATABASE AdventureWorks2025
SET RECOVERY BULK_LOGGED;
GO

SELECT *
INTO dbo.NewProducts
FROM Production.Product
WHERE ListPrice > $25
      AND ListPrice < $100;
GO

ALTER DATABASE AdventureWorks2025
SET RECOVERY FULL;
GO

C. Tworzenie kolumny tożsamości przy użyciu funkcji identity

W poniższym przykładzie użyto IDENTITY funkcji do utworzenia kolumny tożsamości w nowej tabeli Person.USAddress w bazie danych AdventureWorks2025. Ten krok jest wymagany, ponieważ SELECT instrukcja definiująca tabelę zawiera sprzężenie, co uniemożliwia IDENTITY transfer właściwości do nowej tabeli. Wartości inicjacji i przyrostu określone w IDENTITY funkcji różnią się od wartości AddressID 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. Utwórz tabelę, określając kolumny ze źródła danych zdalnych

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. Nazwa MyLinkServer, serwera połączonego jest następnie określona w FROM klauzuli pierwszej SELECT...INTO instrukcji i w OPENQUERY funkcji drugiej SELECT...INTO instrukcji. Trzecia SELECT...INTO instrukcja używa OPENDATASOURCE funkcji, która określa zdalne źródło danych bezpośrednio zamiast używać połączonej nazwy serwera.

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'.
EXECUTE sp_addlinkedserver
    @server = N'MyLinkServer',
    @srvproduct = N' ',
    @provider = N'SQLNCLI',
    @datasrc = N'server_name',
    @catalog = N'AdventureWorks2025';

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

E. Importowanie z tabeli zewnętrznej utworzonej za pomocą technologii PolyBase

W tym przykładzie importuje dane z usługi Hadoop lub Azure Storage do programu SQL Server na potrzeby magazynu trwałego. Następnie jest używana SELECT INTO do importowania danych przywoływalnych przez tabelę zewnętrzną na potrzeby magazynu trwałego w programie SQL Server. Na koniec tworzy tabelę relacyjną na bieżąco, a następnie tworzy indeks magazynu kolumn w tabeli.

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. Skopiuj dane z jednej tabeli do innej i utwórz nową tabelę 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 i nowsze.

ALTER DATABASE [AdventureWorksDW2022]
ADD FILEGROUP FG2;
GO

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