SELECT - INTO Clause (Transact-SQL)

Berlaku untuk:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse Analytics AnalyticsPlatform System (PDW)Warehouse di Microsoft Fabric

PILIH... INTO membuat tabel baru di grup file default dan menyisipkan baris yang dihasilkan dari kueri ke dalamnya. Untuk melihat sintaks SELECT lengkap, lihat SELECT (Transact-SQL).

Konvensi sintaks transact-SQL

Sintaksis

[ INTO new_table ]
[ ON filegroup ]

Catatan

Untuk melihat sintaks Transact-SQL untuk SQL Server 2014 (12.x) dan versi yang lebih lama, lihat Dokumentasi versi sebelumnya.

Argumen

new_table
Menentukan nama tabel baru yang akan dibuat, berdasarkan kolom dalam daftar pilih dan baris yang dipilih dari sumber data.

Format new_table ditentukan dengan mengevaluasi ekspresi dalam daftar pilih. Kolom di new_table dibuat dalam urutan yang ditentukan oleh daftar pilih. Setiap kolom di new_table memiliki nama, jenis data, nullability, dan nilai yang sama dengan ekspresi yang sesuai dalam daftar pilih. Properti IDENTITY kolom ditransfer kecuali dalam kondisi yang ditentukan dalam "Bekerja dengan Kolom Identitas" di bagian Keterangan.

Untuk membuat tabel di database lain pada instans SQL Server yang sama, tentukan new_table sebagai nama yang sepenuhnya memenuhi syarat dalam formulir database.schema.table_name.

Anda tidak dapat membuat new_table di server jarak jauh; namun, Anda dapat mengisi new_table dari sumber data jarak jauh. Untuk membuat new_table dari tabel sumber jarak jauh, tentukan tabel sumber menggunakan nama empat bagian dalam formulir linked_server.katalog.skema.objek dalam klausa FROM dari pernyataan SELECT. Atau, Anda dapat menggunakan fungsi OPENQUERY atau fungsi OPENDATASOURCE dalam klausul FROM untuk menentukan sumber data jarak jauh.

grup file
Menentukan nama grup file tempat tabel baru akan dibuat. Grup file yang ditentukan harus ada pada database di tempat lain mesin SQL Server memunculkan kesalahan.

Berlaku untuk: SQL Server 2016 (13.x) SP2 dan yang lebih baru.

Jenis Data

Atribut FILESTREAM tidak ditransfer ke tabel baru. BLOB FILESTREAM disalin dan disimpan dalam tabel baru sebagai BLOB varbinary(maks ). Tanpa atribut FILESTREAM, jenis data varbinary(max) memiliki batasan 2 GB. Jika BLOB FILESTREAM melebihi nilai ini, kesalahan 7119 dimunculkan dan pernyataan dihentikan.

Saat kolom identitas yang ada dipilih ke dalam tabel baru, kolom baru mewarisi properti IDENTITY, kecuali salah satu kondisi berikut ini benar:

  • Pernyataan PILIH berisi gabungan.

  • Beberapa pernyataan PILIH digabungkan dengan menggunakan PERSATUAN.

  • Kolom identitas dicantumkan lebih dari satu kali dalam daftar pilih.

  • Kolom identitas adalah bagian dari ekspresi.

  • Kolom identitas berasal dari sumber data jarak jauh.

Jika salah satu dari kondisi ini benar, kolom dibuat NOT NULL alih-alih mewarisi properti IDENTITY. Jika kolom identitas diperlukan dalam tabel baru tetapi kolom tersebut tidak tersedia, atau Anda menginginkan nilai benih atau kenaikan yang berbeda dari kolom identitas sumber, tentukan kolom dalam daftar pilih menggunakan fungsi IDENTITY. Lihat "Membuat kolom identitas menggunakan fungsi IDENTITY" di bagian Contoh di bawah ini.

Keterangan

Pernyataan SELECT...INTO beroperasi dalam dua bagian - tabel baru dibuat, lalu baris disisipkan. Ini berarti bahwa jika penyisipan gagal, semuanya akan digulung balik, tetapi tabel baru (kosong) akan tetap ada. Jika Anda memerlukan seluruh operasi untuk berhasil atau gagal secara keseluruhan, gunakan transaksi eksplisit.

Gudang di Microsoft Fabric tidak mendukung grup file. Referensi dan contoh dalam artikel ini ke grup file tidak berlaku untuk Gudang di Microsoft Fabric.

Batasan dan Pembatasan

Anda tidak dapat menentukan variabel tabel atau parameter bernilai tabel sebagai tabel baru.

Anda tidak dapat menggunakan SELECT...INTO untuk membuat tabel yang dipartisi, bahkan ketika tabel sumber dipartisi. SELECT...INTO tidak menggunakan skema partisi tabel sumber; sebagai gantinya, tabel baru dibuat di grup file default. Untuk menyisipkan baris ke dalam tabel yang dipartisi, Anda harus terlebih dahulu membuat tabel yang dipartisi lalu menggunakan pernyataan.INSERT INTO...SELECT...FROM

Indeks, batasan, dan pemicu yang ditentukan dalam tabel sumber tidak ditransfer ke tabel baru, juga tidak dapat ditentukan dalam SELECT...INTO pernyataan. Jika objek ini diperlukan, Anda dapat membuatnya setelah menjalankan SELECT...INTO pernyataan.

Menentukan ORDER BY klausa tidak menjamin baris disisipkan dalam urutan yang ditentukan.

Saat kolom jarang disertakan dalam daftar pilih, properti kolom jarang tidak ditransfer ke kolom dalam tabel baru. Jika properti ini diperlukan dalam tabel baru, ubah definisi kolom setelah menjalankan SELECT... Pernyataan INTO untuk menyertakan properti ini.

Saat kolom komputasi disertakan dalam daftar pilih, kolom terkait dalam tabel baru bukan kolom komputasi. Nilai dalam kolom baru adalah nilai yang dihitung pada saat SELECT...INTO dijalankan.

Perilaku Pengelogan

Jumlah pengelogan untuk SELECT...INTO tergantung pada model pemulihan yang berlaku untuk database. Di bawah model pemulihan sederhana atau model pemulihan yang dicatat secara massal, operasi massal dicatat secara minimal. Dengan pengelogan minimal, menggunakan SELECT...INTO pernyataan bisa lebih efisien daripada membuat tabel lalu mengisi tabel dengan pernyataan INSERT. Untuk informasi selengkapnya, lihat Log Transaksi (SQL Server).

SELECT...INTO pernyataan yang berisi fungsi yang ditentukan pengguna (UDF) adalah operasi yang dicatat sepenuhnya. Jika fungsi yang ditentukan pengguna yang digunakan dalam SELECT...INTO pernyataan tidak melakukan operasi akses data apa pun, Anda dapat menentukan klausul SCHEMABINDING untuk fungsi yang ditentukan pengguna, yang akan mengatur properti UserDataAccess turunan untuk fungsi yang ditentukan pengguna tersebut ke 0. Setelah perubahan ini, SELECT...INTO pernyataan akan dicatat secara minimal. SELECT...INTO Jika pernyataan masih mereferensikan setidaknya satu fungsi yang ditentukan pengguna yang memiliki properti ini diatur ke 1, operasi akan dicatat sepenuhnya.

Izin

Memerlukan izin CREATE TABLE di database tujuan.

Contoh

J. Membuat tabel dengan menentukan kolom dari beberapa sumber

Contoh berikut membuat tabel dbo.EmployeeAddresses dalam database AdventureWorks2022 dengan memilih tujuh kolom dari berbagai tabel terkait karyawan dan terkait alamat.

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. Menyisipkan baris menggunakan pengelogan minimal

Contoh berikut membuat tabel dbo.NewProducts dan menyisipkan baris dari Production.Product tabel. Contoh mengasumsikan bahwa model pemulihan database AdventureWorks2022 diatur ke FULL. Untuk memastikan pengelogan minimal digunakan, model pemulihan database AdventureWorks2022 diatur ke BULK_LOGGED sebelum baris disisipkan dan diatur ulang ke PENUH setelah SELECT... Pernyataan INTO. Proses ini memastikan bahwa SELECT... Pernyataan INTO menggunakan ruang minimal dalam log transaksi dan berkinerja efisien.

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. Membuat kolom identitas menggunakan fungsi IDENTITY

Contoh berikut menggunakan fungsi IDENTITY untuk membuat kolom identitas di tabel Person.USAddress baru dalam database AdventureWorks2022. Ini diperlukan karena pernyataan SELECT yang menentukan tabel berisi gabungan, yang menyebabkan properti IDENTITY tidak ditransfer ke tabel baru. Perhatikan bahwa nilai benih dan kenaikan yang ditentukan dalam fungsi IDENTITY berbeda dari AddressID nilai kolom dalam tabel Person.Addresssumber .

-- 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. Membuat tabel dengan menentukan kolom dari sumber data jarak jauh

Contoh berikut menunjukkan tiga metode pembuatan tabel baru di server lokal dari sumber data jarak jauh. Contoh dimulai dengan membuat tautan ke sumber data jarak jauh. Nama server tertaut, MyLinkServer, kemudian ditentukan dalam klausa FROM dari SELECT pertama... Pernyataan INTO dan dalam fungsi OPENQUERY dari SELECT kedua... Pernyataan INTO. SELECT ketiga... Pernyataan INTO menggunakan fungsi OPENDATASOURCE, yang menentukan sumber data jarak jauh secara langsung alih-alih menggunakan nama server yang ditautkan.

Berlaku untuk: SQL Server 2008 (10.0.x) dan yang lebih baru.

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. Mengimpor dari tabel eksternal yang dibuat dengan PolyBase

Impor data dari Hadoop atau Azure Storage ke SQL Server untuk penyimpanan persisten. Gunakan SELECT INTO untuk mengimpor data yang dirujuk oleh tabel eksternal untuk penyimpanan persisten di SQL Server. Buat tabel relasional dengan cepat lalu buat indeks penyimpanan kolom di atas tabel di langkah kedua.

Berlaku untuk: 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. Menyalin data dari satu tabel ke tabel lain dan membuat tabel baru pada grup file tertentu

Contoh berikut menunjukkan pembuatan tabel baru sebagai salinan tabel lain dan memuatnya ke dalam grup file tertentu yang berbeda dari grup file default pengguna.

Berlaku untuk: SQL Server 2016 (13.x) SP2 dan yang lebih baru.

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

Lihat Juga

SELECT (Transact-SQL)
Contoh SELECT (Transact-SQL)
INSERT (Transact-SQL)
IDENTITY (Function) (Transact-SQL)