Bagikan melalui


SELECT - KLAUSUL INTO (Transact-SQL)

Berlaku untuk:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsSistem Platform Analitik (PDW)Gudang di Microsoft FabricDatabase SQL di Microsoft Fabric

Pernyataan SELECT...INTO membuat tabel baru di grup file default dan menyisipkan baris yang dihasilkan dari kueri ke dalamnya. Untuk sintaks lengkapnya SELECT , lihat SELECT.

Konvensi sintaks transact-SQL

Syntax

[ INTO new_table ]
[ ON filegroup ]

Arguments

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 FROM klausa SELECT pernyataan. Atau, Anda dapat menggunakan fungsi OPENQUERY atau fungsi OPENDATASOURCE dalam FROM klausul untuk menentukan sumber data jarak jauh.

filegroup

Menentukan nama grup file untuk membuat tabel baru. Grup file harus ada di database, atau mesin SQL Server mengembalikan 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 berhenti.

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

  • Pernyataan berisi SELECT gabungan.
  • Beberapa SELECT pernyataan digabungkan dengan menggunakan UNION.
  • 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 kondisi ini benar, kolom dibuat NOT NULL alih-alih mewarisi IDENTITY properti. Jika kolom identitas diperlukan dalam tabel baru tetapi kolom seperti itu tidak tersedia, atau Anda menginginkan nilai benih atau kenaikan yang berbeda dari kolom identitas sumber, tentukan kolom dalam daftar pilih dengan menggunakan IDENTITY fungsi . Lihat "Membuat kolom identitas menggunakan IDENTITY fungsi" di bagian Contoh.

Remarks

Pernyataan SELECT...INTO beroperasi dalam dua bagian: tabel baru dibuat, lalu baris disisipkan. Proses dua langkah ini berarti bahwa jika penyisipan gagal, operasi mengembalikan semua sisipan, tetapi tabel baru (kosong) 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.

Keterbatasan

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 saat 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, anda juga tidak dapat menentukannya dalam SELECT...INTO pernyataan. Jika Anda memerlukan objek ini, Anda dapat membuatnya setelah menjalankan SELECT...INTO pernyataan.

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

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

Saat Anda menyertakan kolom komputasi 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 log

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 SELECT...INTO minimal, pernyataan bisa lebih efisien daripada membuat tabel dan kemudian mengisi tabel dengan INSERT pernyataan. Untuk informasi selengkapnya, lihat artikel log transaksi .

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

Permissions

CREATE TABLE Memerlukan izin dalam database dan ALTER izin pada skema tempat tabel sedang dibuat.

Examples

A. Membuat tabel dengan menentukan kolom dari beberapa sumber

Contoh berikut membuat tabel dbo.EmployeeAddresses dalam database AdventureWorks2025 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
     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. Sisipkan baris menggunakan pengelogan minimal

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

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

Contoh berikut menggunakan IDENTITY fungsi untuk membuat kolom identitas di tabel Person.USAddress baru dalam database AdventureWorks2025. Langkah ini diperlukan karena SELECT pernyataan yang menentukan tabel berisi gabungan, yang mencegah IDENTITY properti ditransfer ke tabel baru. Nilai benih dan kenaikan yang ditentukan dalam IDENTITY fungsi 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 FROM klausul pernyataan pertama SELECT...INTO dan dalam OPENQUERY fungsi pernyataan kedua SELECT...INTO . Pernyataan ketiga SELECT...INTO menggunakan OPENDATASOURCE fungsi , yang menentukan sumber data jarak jauh secara langsung alih-alih menggunakan nama server yang ditautkan.

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

Contoh ini mengimpor data dari Hadoop atau Azure Storage ke SQL Server untuk penyimpanan persisten. Kemudian menggunakan SELECT INTO untuk mengimpor data yang dirujuk oleh tabel eksternal untuk penyimpanan persisten di SQL Server. Terakhir, ia membuat tabel relasional dengan cepat, lalu membuat indeks penyimpan kolom pada tabel.

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. Salin data dari satu tabel ke tabel lain dan buat 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;
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];