SELECT - INTO Clause (Transact-SQL)
Berlaku untuk: SQL Server Azure SQL Database Azure SQL Managed Instance Azure Synapse Analytics Analytics Platform 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).
Sintaks
[ INTO new_table ]
[ ON filegroup ]
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 dalam database dan izin UBAH pada skema tempat tabel sedang dibuat.
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.Address
sumber .
-- 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)