Ескертпе
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Жүйеге кіруді немесе каталогтарды өзгертуді байқап көруге болады.
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Каталогтарды өзгертуді байқап көруге болады.
Применимо к:SQL Server
База данных
SQL AzureУправляемый экземпляр
SQL AzureAzure Synapse Analytics
Система платформы аналитики (PDW)
Хранилище в Microsoft Fabric
База данных SQL в Microsoft Fabric
Инструкция SELECT...INTO создает новую таблицу в файловой группе по умолчанию и вставляет в него результирующий текст строк из запроса. Полный синтаксис см. в SELECT разделе SELECT.
Соглашения о синтаксисе Transact-SQL
Syntax
[ INTO new_table ]
[ ON filegroup ]
Arguments
new_table
Указывает имя создаваемой таблицы на основе столбцов в списке выбора и строк, выбранных из источника данных.
Формат аргумента new_table определяется путем расчета выражений, указанных в списке выбора. Столбцы в таблице, указанной в аргументе new_table, создаются в порядке, соответствующем списку выбора. Все столбцы таблицы, указанной в аргументе new_table, получают такие же имена, значения, типы данных и свойства допустимости значений NULL, которые указаны в соответствующем выражении в списке выбора. Свойство IDENTITY столбца передается, за исключением условий, определенных в разделе "Работа с столбцами удостоверений".
Чтобы создать таблицу в другой базе данных в том же экземпляре SQL Server, укажите new_table в качестве полного имени в форме database.schema.table_name.
Невозможно создать new_table на удаленном сервере. Однако вы можете заполнить new_table из удаленного источника данных. Чтобы создать new_table из удаленной исходной таблицы, укажите исходную таблицу с помощью четырехкомпонентного имени в форме linked_server. каталог. схема. объект в FROM предложении инструкции SELECT . Кроме того, можно использовать функцию OPENQUERY или функцию OPENDATASOURCE в FROM предложении, чтобы указать удаленный источник данных.
filegroup
Указывает имя файловой группы, в которой создается новая таблица. Файловая группа должна существовать в базе данных, или подсистема SQL Server возвращает ошибку.
Область применения: SQL Server 2016 (13.x) с пакетом обновления 2 (SP2) и более поздних версий.
Типы данных
Атрибут FILESTREAM не передается в новую таблицу. Объекты BLOB FILESTREAM копируются и хранятся в новой таблице как объекты BLOB типа varbinary(max). Без атрибута FILESTREAM тип данных varbinary(max) имеет ограничение в 2 ГБ. Если BLOB-объект FILESTREAM превышает это значение, возникает ошибка 7119 и инструкция останавливается.
При выборе существующего столбца удостоверений в новую таблицу новый столбец наследует IDENTITY свойство, если только одно из следующих условий не имеет значения true:
- Инструкция
SELECTсодержит соединение. - Несколько
SELECTоператоров объединяются с помощьюUNION. - столбец идентификаторов встречается более чем один раз в списке выбора;
- столбец идентификаторов является частью выражения;
- столбец идентификаторов получен из удаленного источника данных.
Если одно из этих условий имеет значение true, столбец создается NOT NULL вместо наследования IDENTITY свойства. Если в новой таблице требуется столбец удостоверений, но такой столбец недоступен, или требуется начальное или добавочное значение, отличное от столбца исходного удостоверения, определите столбец в списке выбора с помощью IDENTITY функции. См. раздел "Создание столбца удостоверений с помощью IDENTITY функции" в разделе "Примеры".
Remarks
Оператор SELECT...INTO работает в двух частях: создается новая таблица, а затем вставляются строки. Этот двухэтапный процесс означает, что если вставка завершается ошибкой, операция откатывает все вставки, но новая (пустая) таблица остается. Если вам нужно гарантировать успех или неуспех всей операции целиком, используйте явную транзакцию.
Хранилище в Microsoft Fabric не поддерживает файловые группы. Ссылки и примеры в этой статье для файловых групп не применяются к хранилищу в Microsoft Fabric.
Ограничения
Нельзя указать переменную таблицы или параметр табличного значения в качестве новой таблицы.
Создать секционированную таблицу нельзя SELECT...INTO , даже если исходная таблица секционирована.
SELECT...INTO не использует схему секционирования исходной таблицы. Вместо этого новая таблица создается в файловой группе по умолчанию. Для вставки строк в секционированную таблицу необходимо сначала создать секционированную таблицу, а затем использовать инструкцию INSERT INTO...SELECT...FROM.
Индексы, ограничения и триггеры, определенные в исходной таблице, не передаются в новую таблицу и не могут указывать их в инструкции SELECT...INTO . Если вам нужны эти объекты, их можно создать после выполнения инструкции SELECT...INTO .
Указание ORDER BY предложения не гарантирует вставку строк в указанном порядке.
При включении разреженного столбца в список выбора свойство разреженного столбца не передается в столбец в новой таблице. Если это свойство необходимо в новой таблице, измените определение столбца после выполнения SELECT...INTO инструкции, чтобы включить это свойство.
При включении вычисляемого столбца в список выбора соответствующий столбец в новой таблице не является вычисляемой. Значениями нового столбца становятся значения, вычисленные при выполнении инструкции SELECT...INTO.
Поведение журнала
Объем информации, записываемой в журнал для операции SELECT...INTO, зависит от модели восстановления, действующей для базы данных. В модели восстановления с неполным протоколированием и в простой модели массовые операции минимально протоколируются. С минимальным ведением журнала SELECT...INTO оператор может быть более эффективным, чем создание таблицы, а затем заполнение таблицы оператором INSERT . Дополнительные сведения см. в статье журнала транзакций .
Инструкции SELECT...INTO, содержащие определяемые пользователем функции (UDF), являются полностью протоколируемыми операциями. Если определяемые пользователем функции, используемые SELECT...INTO инструкцией, не выполняют никаких операций доступа к данным, можно указать SCHEMABINDING предложение для определяемых пользователем функций. Это предложение задает производное UserDataAccess свойство для определяемых пользователем функций 0. После этого изменения SELECT...INTO операторы регистрируются минимально.
SELECT...INTO Если инструкция по-прежнему ссылается по крайней мере на одну определяемую пользователем функцию с заданным свойством1, операция полностью регистрируется.
Permissions
Требуется разрешение CREATE TABLE в базе данных и разрешение ALTER для схемы, в которой создается таблица.
Examples
A. Создание таблицы путем указания столбцов из нескольких источников
Следующий пример создаёт таблицу dbo.EmployeeAddresses в базе данных AdventureWorks2025, выбрав семь столбцов из различных таблиц, связанных с сотрудниками и адресами.
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. Вставка строк с помощью минимального ведения журнала
В следующем примере создается таблица dbo.NewProducts, а затем вставляются строки из таблицы Production.Product. В примере предполагается, что для модели восстановления базы данных AdventureWorks2025 задано значение FULL. Чтобы обеспечить минимальное ведение журнала, модель восстановления базы данных AdventureWorks2025 устанавливается BULK_LOGGED перед вставками строк и сбрасывает ее FULL после инструкции SELECT...INTO . Этот процесс гарантирует, что SELECT...INTO инструкция использует минимальное пространство в журнале транзакций и эффективно выполняется.
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. Создание столбца удостоверений с помощью функции удостоверения
В следующем примере функция используется IDENTITY для создания столбца удостоверений в новой таблице Person.USAddress в базе данных AdventureWorks2025. Этот шаг требуется, так как SELECT инструкция, определяющая таблицу, содержит соединение, которое предотвращает IDENTITY передачу свойства в новую таблицу. Значения начального и добавочного значения, указанные в IDENTITY функции, отличаются от значений столбца AddressID в исходной таблице 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. Создание таблицы путем указания столбцов из удаленного источника данных
В следующем примере показаны три метода создания новой таблицы на локальном сервере из удаленного источника данных. Пример начинается с создания ссылки на удаленный источник данных. Затем имя MyLinkServer, связанного сервера указывается в FROM предложении первой SELECT...INTO инструкции и в OPENQUERY функции второго SELECT...INTO оператора.
SELECT...INTO Третья инструкция использует OPENDATASOURCE функцию, которая указывает удаленный источник данных непосредственно вместо использования имени связанного сервера.
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. Импорт из внешней таблицы, созданной с помощью PolyBase
В этом примере данные из Hadoop или службы хранилища Azure импортируются в SQL Server для постоянного хранения. Затем он используется SELECT INTO для импорта данных, на которые ссылается внешняя таблица для постоянного хранилища в SQL Server. Наконец, он создает реляционную таблицу на лету, а затем создает индекс columnstore в таблице.
Область применения: 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. Копирование данных из одной таблицы в другую и создание новой таблицы в указанной файловой группе
В следующем примере показано создание новой таблицы в качестве копии другой таблицы и ее загрузка в указанную файловую группу, отличную от файловой группы по умолчанию для пользователя.
Область применения: SQL Server 2016 (13.x) с пакетом обновления 2 (SP2) и более поздних версий.
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];