SELECT - KLAUSUL INTO (Transact-SQL)

Berlaku untuk:yes SQL Server (semua versi yang didukung) YesAzure SQL Database YesAzure SQL Managed Instance yesAzure Synapse Analytics Analytics yesPlatform System (PDW)

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).

Topic link iconKonvensi Sintaksis T-SQL

Sintaks

[ INTO new_table ]
[ ON filegroup ]

Catatan

Untuk melihat sintaks Transact-SQL untuk SQL Server 2014 dan 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 terkait 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 pada 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 klausa FROM untuk menentukan sumber data jarak jauh.

grup file
Menentukan nama grup file tempat tabel baru akan dibuat. Grup file yang ditentukan harus ada di database jika tidak, mesin SQL Server melemparkan 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(max ). Tanpa atribut FILESTREAM, jenis data varbinary(max) memiliki batasan 2 GB. Jika FILESTREAM BLOB melebihi nilai ini, kesalahan 7119 dinaikkan dan pernyataan dihentikan.

Saat kolom identitas yang sudah 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 seperti itu tidak tersedia, atau Anda menginginkan nilai benih atau tahapan 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 beroperasi SELECT...INTO dalam dua bagian - tabel baru dibuat, lalu baris disisipkan. Ini berarti bahwa jika sisipan 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.

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 dalam 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 bukanlah 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 klausa 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 mengatur properti ini ke 1, operasi akan dicatat sepenuhnya.

Izin

Memerlukan izin CREATE TABLE di database tujuan.

Contoh

A. Membuat tabel dengan menentukan kolom dari beberapa sumber

Contoh berikut membuat tabel dbo.EmployeeAddresses dalam database AdventureWorks2012 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 AdventureWorks2012 diatur ke PENUH. Untuk memastikan pengelogan minimal digunakan, model pemulihan database AdventureWorks2012 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 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. Membuat kolom identitas menggunakan fungsi IDENTITY

Contoh berikut menggunakan fungsi IDENTITY untuk membuat kolom identitas di tabel Person.USAddress baru di database AdventureWorks2012. 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 yang ditautkan, 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 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'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. 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 dalam 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 [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];

Lihat juga

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