Предложение SELECT ...INTO (Transact-SQL)SELECT - INTO Clause (Transact-SQL)

ОБЛАСТЬ ПРИМЕНЕНИЯ: даSQL Server даБаза данных SQL Azure даAzure Synapse Analytics (хранилище данных SQL) даParallel Data Warehouse APPLIES TO: yesSQL Server yesAzure SQL Database yesAzure Synapse Analytics (SQL DW) yesParallel Data Warehouse

Инструкция SELECT…INTO создает новую таблицу в файловой группе по умолчанию и вставляет в нее результирующие строки из запроса.SELECT...INTO creates a new table in the default filegroup and inserts the resulting rows from the query into it. Полный синтаксис SELECT см. в разделе SELECT (Transact-SQL).To view the complete SELECT syntax, see SELECT (Transact-SQL).

Значок ссылки на раздел Синтаксические обозначения в Transact-SQLTopic link icon Transact-SQL Syntax Conventions

СинтаксисSyntax

[ INTO new_table ]
[ ON filegroup ]

АргументыArguments

new_table new_table
Указывает имя новой таблицы, создаваемой на основе столбцов, указанных в списке выбора, и строк, выбираемых из источника данных.Specifies the name of a new table to be created, based on the columns in the select list and the rows chosen from the data source.

Формат аргумента new_table определяется путем расчета выражений, указанных в списке выбора.The format of new_table is determined by evaluating the expressions in the select list. Столбцы в таблице, указанной в аргументе new_table, создаются в порядке, соответствующем списку выбора.The columns in new_table are created in the order specified by the select list. Все столбцы таблицы, указанной в аргументе new_table, получают такие же имена, значения, типы данных и свойства допустимости значений NULL, которые указаны в соответствующем выражении в списке выбора.Each column in new_table has the same name, data type, nullability, and value as the corresponding expression in the select list. Свойство IDENTITY столбца переносится за исключением случаев, когда наступают условия, описанные в подразделе «Примечания» раздела «Работа со столбцами идентификаторов».The IDENTITY property of a column is transferred except under the conditions defined in "Working with Identity Columns" in the Remarks section.

Для того чтобы создать таблицу в другой базе данных в этом же экземпляре службы SQL ServerSQL Server, определите new_table в качестве полного имени в форме database.schema.table_name.To create the table in another database on the same instance of SQL ServerSQL Server, specify new_table as a fully qualified name in the form database.schema.table_name.

new_table нельзя создать на удаленном сервере, однако new_table можно заполнить из удаленного источника данных.You cannot create new_table on a remote server; however, you can populate new_table from a remote data source. Для создания таблицы new_table из удаленного источника таблицы определите источник таблицы, используя четырехчастное имя в форме linked_server.catalog.schema.object в предложении FROM инструкции SELECT.To create new_table from a remote source table, specify the source table using a four-part name in the form linked_server.catalog.schema.object in the FROM clause of the SELECT statement. Для указания удаленного источника данных также можно использовать функцию OPENQUERY или функцию OPENDATASOURCE в предложении FROM.Alternatively, you can use the OPENQUERY function or the OPENDATASOURCE function in the FROM clause to specify the remote data source.

filegroup filegroup
Указывает имя файловой группы, в которой будет создана таблица.Specifies the name of the filegroup in which new table will be created. Указанная файловая группа должна существовать в базе данных, в противном случае обработчик SQL Server создает ошибку.The filegroup specified should exist on the database else the SQL Server engine throws an error.

Применимо к: SQL Server 2016 (13.x)SQL Server 2016 (13.x) с пакетом обновления 2 (SP2) и выше.Applies to: SQL Server 2016 (13.x)SQL Server 2016 (13.x) SP2 and later.

Типы данныхData Types

Атрибут FILESTREAM не переносится в новую таблицу.The FILESTREAM attribute does not transfer to the new table. Объекты BLOB FILESTREAM копируются и хранятся в новой таблице как объекты BLOB типа varbinary(max) .FILESTREAM BLOBs are copied and stored in the new table as varbinary(max) BLOBs. Без атрибута FILESTREAM тип данных varbinary(max) имеет ограничение в 2 ГБ.Without the FILESTREAM attribute, the varbinary(max) data type has a limitation of 2 GB. Если размер большого двоичного объекта FILESTREAM превышает это значение, происходит ошибка 7119 и инструкция прекращает работу.If a FILESTREAM BLOB exceeds this value, error 7119 is raised and the statement is stopped.

При выборе существующего столбца идентификаторов в новой таблице новый столбец наследует свойство IDENTITY, если не выполняется ни одно из следующих условий.When an existing identity column is selected into a new table, the new column inherits the IDENTITY property, unless one of the following conditions is true:

  • Инструкция SELECT содержит соединение.The SELECT statement contains a join.

  • несколько инструкций SELECT соединены при помощи UNION;Multiple SELECT statements are joined by using UNION.

  • столбец идентификаторов встречается более чем один раз в списке выбора;The identity column is listed more than one time in the select list.

  • столбец идентификаторов является частью выражения;The identity column is part of an expression.

  • столбец идентификаторов получен из удаленного источника данных.The identity column is from a remote data source.

Если любое из этих условий выполняется, столбец создается как NOT NULL и не наследует свойство IDENTITY.If any one of these conditions is true, the column is created NOT NULL instead of inheriting the IDENTITY property. Если в новой таблице необходим столбец идентификаторов, но такой столбец недоступен или необходимо изменить начальное значение или шаг приращения по сравнению с исходным столбцом идентификаторов, определите столбец в списке выбора с помощью функции IDENTITY.If an identity column is required in the new table but such a column is not available, or you want a seed or increment value that is different than the source identity column, define the column in the select list using the IDENTITY function. См. подраздел «Создание столбца идентификаторов с помощью функции IDENTITY» далее в разделе «Примеры».See "Creating an identity column using the IDENTITY function" in the Examples section below.

RemarksRemarks

Инструкция SELECT...INTO работает в два этапа — создается новая таблица, затем вставляются строки.The SELECT...INTO statement operates in two parts - the new table is created, and then rows are inserted. Это означает, что если произойдет сбой операций вставки, все они откатываются, но новая таблица остается (пустая).This means that if the inserts fail, they will all be rolled back, but the new (empty) table will remain. Если вам нужно гарантировать успех или неуспех всей операции целиком, используйте явную транзакцию.If you need the entire operation to succeed or fail as a whole, use an explicit transaction.

ОграниченияLimitations and Restrictions

В качестве новой таблицы нельзя указывать табличную переменную или возвращающий табличное значение параметр.You cannot specify a table variable or table-valued parameter as the new table.

Инструкцию SELECT...INTO нельзя использовать для создания секционированной таблицы, даже если исходная таблица является секционированной.You cannot use SELECT...INTO to create a partitioned table, even when the source table is partitioned. Инструкция SELECT...INTO не использует схему секционирования исходной таблицы. Вместо этого новая таблица создается в файловой группе по умолчанию.SELECT...INTO does not use the partition scheme of the source table; instead, the new table is created in the default filegroup. Для вставки строк в секционированную таблицу необходимо сначала создать секционированную таблицу, а затем использовать инструкцию INSERT INTO...SELECT...FROM.To insert rows into a partitioned table, you must first create the partitioned table and then use the INSERT INTO...SELECT...FROM statement.

Индексы, ограничения и триггеры, определенные в исходной таблице, не переносятся в новую таблицу, их также нельзя указывать в инструкции SELECT...INTO.Indexes, constraints, and triggers defined in the source table are not transferred to the new table, nor can they be specified in the SELECT...INTO statement. Если эти объекты нужны для дальнейшей работы, их можно создать после выполнения инструкции SELECT...INTO.If these objects are required, you can create them after executing the SELECT...INTO statement.

Указание предложения ORDER BY не гарантирует, что строки будут вставлены в указанном порядке.Specifying an ORDER BY clause does not guarantee the rows are inserted in the specified order.

Если в список выбора входит разреженный столбец, то свойство разреженного столбца не передается столбцу в новой таблице.When a sparse column is included in the select list, the sparse column property does not transfer to the column in the new table. Если это свойство необходимо в новой таблице, измените определение столбца после выполнения инструкции SELECT...INTO для включения этого свойства.If this property is required in the new table, alter the column definition after executing the SELECT...INTO statement to include this property.

Если в список выбора входит вычисляемый столбец, соответствующий столбец новой таблицы не будет вычисляемым.When a computed column is included in the select list, the corresponding column in the new table is not a computed column. Значениями нового столбца становятся значения, вычисленные при выполнении инструкции SELECT...INTO.The values in the new column are the values that were computed at the time SELECT...INTO was executed.

Режим ведения журналаLogging Behavior

Объем информации, записываемой в журнал для операции SELECT...INTO, зависит от модели восстановления, действующей для базы данных.The amount of logging for SELECT...INTO depends on the recovery model in effect for the database. В модели восстановления с неполным протоколированием и в простой модели массовые операции минимально протоколируются.Under the simple recovery model or bulk-logged recovery model, bulk operations are minimally logged. При минимальном ведении журнала использование инструкции SELECT...INTO может оказаться более эффективным, чем создание таблицы и заполнение ее инструкцией INSERT.With minimal logging, using the SELECT...INTO statement can be more efficient than creating a table and then populating the table with an INSERT statement. Дополнительные сведения см. в статье Журнал транзакций (SQL Server).For more information, see The Transaction Log (SQL Server).

РазрешенияPermissions

Требуется разрешение CREATE TABLE в целевой базе данных.Requires CREATE TABLE permission in the destination database.

ПримерыExamples

A.A. Создание таблицы путем указания столбцов из нескольких источниковCreating a table by specifying columns from multiple sources

В следующем примере таблица dbo.EmployeeAddresses создается в базе данных AdventureWorks2012AdventureWorks2012 с помощью выбора семи столбцов из различных таблиц, содержащих сведения о сотрудниках и адресах.The following example creates the table dbo.EmployeeAddresses in the AdventureWorks2012AdventureWorks2012 database by selecting seven columns from various employee-related and address-related tables.

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. Вставка строк с применением минимального протоколированияInserting rows using minimal logging

В следующем примере создается таблица dbo.NewProducts, а затем вставляются строки из таблицы Production.Product.The following example creates the table dbo.NewProducts and inserts rows from the Production.Product table. В примере предполагается, что для базы данных AdventureWorks2012AdventureWorks2012 выбрана модель восстановления FULL.The example assumes that the recovery model of the AdventureWorks2012AdventureWorks2012 database is set to FULL. Чтобы убедиться, что применяется минимальное протоколирование, модель восстановления базы данных AdventureWorks2012AdventureWorks2012 устанавливается в значение BULK_LOGGED перед вставкой строк и возвращается в значение FULL после инструкции SELECT...INTO.To ensure minimal logging is used, the recovery model of the AdventureWorks2012AdventureWorks2012 database is set to BULK_LOGGED before rows are inserted and reset to FULL after the SELECT...INTO statement. Эта процедура обеспечивает минимальное использование журнала транзакций инструкцией SELECT...INTO и ее эффективное выполнение.This process ensures that the SELECT...INTO statement uses minimal space in the transaction log and performs efficiently.

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

В.C. Создание столбца идентификаторов с помощью функции IDENTITYCreating an identity column using the IDENTITY function

В следующем примере используется функция IDENTITY для создания столбца идентификаторов в новой таблице Person.USAddress в базе данных AdventureWorks2012AdventureWorks2012.The following example uses the IDENTITY function to create an identity column in the new table Person.USAddress in the AdventureWorks2012AdventureWorks2012 database. Это необходимо, поскольку инструкция SELECT, которая определяет таблицу, содержит соединение, и в результате свойство IDENTITY не переносится в новую таблицу.This is required because the SELECT statement that defines the table contains a join, which causes the IDENTITY property to not transfer to the new table. Обратите внимание, что начальное значение и шаг приращения, заданные в функции IDENTITY, отличаются от значений в столбце AddressID исходной таблицы Person.Address.Notice that the seed and increment values specified in the IDENTITY function are different from those of the AddressID column in the source table 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. Создание таблицы путем указания столбцов из удаленного источника данныхCreating a table by specifying columns from a remote data source

В следующем примере показаны три метода создания новой таблицы на локальном сервере из удаленного источника данных.The following example demonstrates three methods of creating a new table on the local server from a remote data source. Пример начинается с создания ссылки на удаленный источник данных.The example begins by creating a link to the remote data source. Затем задается имя связанного сервера (MyLinkServer,) в предложении FROM первой инструкции SELECT...INTO и в функции OPENQUERY второй инструкции SELECT...INTO.The linked server name, MyLinkServer, is then specified in the FROM clause of the first SELECT...INTO statement and in the OPENQUERY function of the second SELECT...INTO statement. В третьей инструкции SELECT...INTO используется функция OPENDATASOURCE, которая непосредственно задает удаленный источник данных, не указывая имя связанного сервера.The third SELECT...INTO statement uses the OPENDATASOURCE function, which specifies the remote data source directly instead of using the linked server name.

Применимо к: SQL Server 2008SQL Server 2008 и выше.Applies to: SQL Server 2008SQL Server 2008 and later.

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

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

Д.E. Импорт из внешней таблицы, созданной с помощью PolyBaseImport from an external table created with PolyBase

Вы можете импортировать данные из Hadoop или службы хранилища Azure в SQL Server для постоянного хранения.Import data from Hadoop or Azure Storage into SQL Server for persistent storage. Чтобы импортировать данные, на которые ссылается внешняя таблица, следует использовать SELECT INTO.Use SELECT INTO to import data referenced by an external table for persistent storage in SQL Server. Оперативно создайте реляционную таблицу, а затем индекс хранилища столбца на основе таблицы, описанной на втором шаге.Create a relational table on-the-fly and then create a column-store index on top of the table in a second step.

Применимо к: SQL ServerSQL Server.Applies to: SQL ServerSQL 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. Создание новой таблицы в качестве копии другой таблицы и ее загрузка в указанную файловую группуCreating a new table as a copy of another table and loading it a specified filegroup

В следующем примере показано создание новой таблицы в качестве копии другой таблицы и ее загрузка в указанную файловую группу, отличную от файловой группы по умолчанию для пользователя.The following example demonstrates creating a new table as a copy of another table and loading it into a specified filegroup different from the default filegroup of the user.

Применимо к: SQL Server 2016 (13.x)SQL Server 2016 (13.x) с пакетом обновления 2 (SP2) и выше.Applies to: SQL Server 2016 (13.x)SQL Server 2016 (13.x) SP2 and later.

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

См. также:See Also

SELECT (Transact-SQL) SELECT (Transact-SQL)
Примеры использования инструкции SELECT (Transact-SQL) SELECT Examples (Transact-SQL)
INSERT (Transact-SQL) INSERT (Transact-SQL)
IDENTITY (функция) (Transact-SQL)IDENTITY (Function) (Transact-SQL)