Aracılığıyla paylaş


SELECT - INTO Yan Tümcesi (Transact-SQL)

Şunlar için geçerlidir:SQL ServerAzure SQL VeritabanıAzure SQL Yönetilen ÖrneğiAzure Synapse AnalyticsAnaliz Platformu Sistemi (PDW)Microsoft Fabric'te ambarMicrosoft Fabric'te SQL veritabanı

SEÇMEK... INTO, varsayılan dosya grubunda yeni bir tablo oluşturur ve sorgudan elde edilen satırları buna ekler. SELECT söz diziminin tamamını görüntülemek için bkz. SELECT (Transact-SQL).

Transact-SQL söz dizimi kuralları

Syntax

[ INTO new_table ]
[ ON filegroup ]

Arguments

new_table
Seçim listesindeki sütunlara ve veri kaynağından seçilen satırlara göre oluşturulacak yeni tablonun adını belirtir.

new_table biçimi, seçme listesindeki ifadeler değerlendirilerek belirlenir. new_table sütunları, seçme listesi tarafından belirtilen sırada oluşturulur. new_table'daki her sütun, seçme listesindeki karşılık gelen ifadeyle aynı ada, veri türüne, null atanabilirliğe ve değere sahiptir. Bir sütunun IDENTITY özelliği, Açıklamalar bölümündeki "Kimlik Sütunlarıyla Çalışma" bölümünde tanımlanan koşullar dışında aktarılır.

Tabloyu aynı SQL Server örneğindeki başka bir veritabanında oluşturmak için new_table form database.schema.table_name tam ad olarak belirtin.

Uzak sunucuda new_table oluşturamazsınız; ancak, new_table uzak bir veri kaynağından doldurabilirsiniz. Uzak kaynak tablodan new_table oluşturmak için, form linked_server dört bölümlü bir ad kullanarak kaynak tabloyu belirtin. kataloğunu seçin. şemasını seçin. nesnesini SEÇIN deyiminin FROM yan tümcesinde bulabilirsiniz. Alternatif olarak, uzak veri kaynağını belirtmek için FROM yan tümcesindeki OPENQUERY işlevini veya OPENDATASOURCE işlevini kullanabilirsiniz.

Dosya grubu
Yeni tablonun oluşturulacağı dosya grubunun adını belirtir. Belirtilen dosya grubu veritabanında bulunmalıdır, aksi halde SQL Server altyapısı bir hata oluşturur.

Şunlar için geçerlidir: SQL Server 2016 (13.x) SP2 ve üzeri.

Veri Türleri

FILESTREAM özniteliği yeni tabloya aktarılmaz. FILESTREAM BLOB'ları yeni tabloda varbinary(max) BLOB'lar olarak kopyalanır ve depolanır. FILESTREAM özniteliği olmadan , varbinary(max) veri türünün 2 GB sınırlaması vardır. FILESTREAM BLOBu bu değeri aşarsa, hata 7119 oluşturulur ve deyimi durdurulur.

Mevcut bir kimlik sütunu yeni bir tabloya seçildiğinde, aşağıdaki koşullardan biri doğru olmadığı sürece yeni sütun IDENTITY özelliğini devralır:

  • SELECT deyimi birleştirme içeriyor.

  • Birden çok SELECT deyimi UNION kullanılarak birleştiriliyor.

  • Kimlik sütunu, seçme listesinde birden çok kez listelenir.

  • Kimlik sütunu bir ifadenin parçasıdır.

  • Kimlik sütunu uzak bir veri kaynağından geliyor.

Bu koşullardan biri true ise, IDENTITY özelliğini devralma yerine NOT NULL sütunu oluşturulur. Yeni tabloda bir kimlik sütunu gerekliyse ancak böyle bir sütun kullanılamıyorsa veya kaynak kimlik sütunundan farklı bir tohum veya artış değeri istiyorsanız, IDENTITY işlevini kullanarak seçme listesindeki sütunu tanımlayın. Aşağıdaki Örnekler bölümünde "IDENTITY işlevini kullanarak kimlik sütunu oluşturma" bölümüne bakın.

Remarks

deyimi SELECT...INTO iki bölümde çalışır. Yeni tablo oluşturulur ve satırlar eklenir. Bu, eklemelerin başarısız olması durumunda tümünün geri alınacağı, ancak yeni (boş) tablonun kalacağı anlamına gelir. İşlemin tamamının bir bütün olarak başarılı olması veya başarısız olması gerekiyorsa , açık bir işlem kullanın.

Microsoft Fabric'teki ambar dosya gruplarını desteklemez. Bu makaledeki dosya gruplarına başvurular ve örnekler Microsoft Fabric'teki Ambar için geçerli değildir.

Sınırlamalar ve Kısıtlamalar

Yeni tablo olarak tablo değişkeni veya tablo değerli parametre belirtemezsiniz.

Kaynak tablo bölümlenmiş olsa bile bölümlenmiş tablo oluşturmak için kullanamazsınız SELECT...INTO . SELECT...INTO kaynak tablonun bölüm düzenini kullanmaz; bunun yerine, yeni tablo varsayılan dosya grubunda oluşturulur. Bölümlenmiş tabloya satır eklemek için önce bölümlenmiş tabloyu oluşturmanız ve ardından deyimini INSERT INTO...SELECT...FROM kullanmanız gerekir.

Kaynak tabloda tanımlanan dizinler, kısıtlamalar ve tetikleyiciler yeni tabloya aktarılmaz ve deyiminde SELECT...INTO belirtilmez. Bu nesneler gerekliyse, deyimini SELECT...INTO yürütürken bunları oluşturabilirsiniz.

Yan ORDER BY tümcenin belirtilmesi, satırların belirtilen sırada eklenmesini garanti etmez.

Seyrek sütun seçme listesine eklendiğinde seyrek sütun özelliği yeni tablodaki sütuna aktarılmaz. Bu özellik yeni tabloda gerekliyse, SELECT... yürütülürken sütun tanımını değiştirin. BU özelliği eklemek için INTO deyimi.

Hesaplanan sütun seçme listesine eklendiğinde, yeni tablodaki ilgili sütun hesaplanan sütun değildir. Yeni sütundaki değerler, yürütülürken hesaplanan SELECT...INTO değerlerdir.

Kayıt Davranışı

için SELECT...INTO günlüğe kaydetme miktarı, veritabanı için geçerli olan kurtarma modeline bağlıdır. Basit kurtarma modeli veya toplu günlüğe kaydedilen kurtarma modeli altında toplu işlemler en az günlüğe kaydedilir. Minimum günlük kaydıyla deyimini SELECT...INTO kullanmak, tablo oluşturmaktan ve sonra tabloyu INSERT deyimiyle doldurmaktan daha verimli olabilir. Daha fazla bilgi için bkz . İşlem Günlüğü (SQL Server).

SELECT...INTO kullanıcı tanımlı işlevler (UDF) içeren deyimler tam olarak günlüğe kaydedilen işlemlerdir. deyiminde SELECT...INTO kullanılan kullanıcı tanımlı işlevler herhangi bir veri erişim işlemi gerçekleştirmiyorsa, kullanıcı tanımlı işlevler için SCHEMABINDING yan tümcesini belirtebilirsiniz. Bu yan tümce, bu kullanıcı tanımlı işlevler için türetilmiş UserDataAccess özelliğini 0 olarak ayarlar. Bu değişiklik sonrasında deyimler SELECT...INTO en az günlüğe kaydedilir. SELECT...INTO Deyimi bu özelliği 1 olarak ayarlanmış en az bir kullanıcı tanımlı işleve başvuruda bulunuyorsa, işlem tam olarak günlüğe kaydedilir.

Permissions

Veritabanında CREATE TABLE izni ve tablonun oluşturulduğu şemada ALTER izni gerektirir.

Examples

A. Birden çok kaynaktan sütun belirterek tablo oluşturma

Aşağıdaki örnek, çeşitli çalışan ve adresle ilgili tablolardan yedi sütun seçerek AdventureWorks2025 veritabanında tablo oluşturur dbo.EmployeeAddresses .

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. Minimum günlük kullanarak satır ekleme

Aşağıdaki örnek, tabloyu oluşturur ve tablodan dbo.NewProductsProduction.Product satır ekler. Örnek, AdventureWorks2025 veritabanının kurtarma modelinin FULL olarak ayarlandığını varsayıyor. Minimum günlük kullanımını sağlamak için, AdventureWorks2025 veritabanının kurtarma modeli, satırlar eklenmeden önce BULK_LOGGED olarak ayarlanır ve SELECT... İÇ VER. Bu işlem, SELECT... INTO deyimi işlem günlüğünde minimum alan kullanır ve verimli bir şekilde performans gösterir.

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. IDENTITY işlevini kullanarak kimlik sütunu oluşturma

Aşağıdaki örnek, AdventureWorks2025 veritabanındaki yeni tabloda Person.USAddress bir kimlik sütunu oluşturmak için IDENTITY fonksiyonunu kullanır. Bu gereklidir çünkü tabloyu tanımlayan SELECT deyimi bir birleşim içerir ve bu da IDENTITY özelliğinin yeni tabloya aktarılmamasıyla sonuçlanır. IDENTITY işlevinde belirtilen tohum ve artış değerlerinin kaynak tablodaki AddressIDPerson.Addresssütundan farklı olduğuna dikkat edin.

-- 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. Uzak veri kaynağından sütunlar belirterek tablo oluşturma

Aşağıdaki örnekte, uzak bir veri kaynağından yerel sunucuda yeni bir tablo oluşturmanın üç yöntemi gösterilmektedir. Örnek, uzak veri kaynağına bir bağlantı oluşturarak başlar. Bağlı sunucu adı, MyLinkServer, daha sonra ilk SELECT... öğesinin FROM yan tümcesinde belirtilir. INTO deyimi ve ikinci SELECT'in OPENQUERY işlevinde... INTO deyimi. Üçüncü SELECT... INTO deyimi, bağlı sunucu adını kullanmak yerine doğrudan uzak veri kaynağını belirten OPENDATASOURCE işlevini kullanır.

Şunlar için geçerlidir: SQL Server 2008 (10.0.x) ve üzeri.

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. PolyBase ile oluşturulan dış tablodan içeri aktarma

Kalıcı depolama için Hadoop veya Azure Depolama'dan SQL Server'a veri aktar. SQL Server'da kalıcı depolama için dış tablo tarafından başvuruda bulunılan verileri içeri aktarmak için kullanın SELECT INTO . Anında bir ilişkisel tablo oluşturun ve ardından ikinci adımda tablonun üstünde bir sütun deposu dizini oluşturun.

Şunlar için geçerlidir: 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. Verileri bir tablodan diğerine kopyalama ve yeni tabloyu belirtilen bir dosya grubunda oluşturma

Aşağıdaki örnekte, başka bir tablonun kopyası olarak yeni bir tablo oluşturma ve bunu kullanıcının varsayılan dosya grubundan farklı bir belirtilen dosya grubuna yükleme gösterilmektedir.

Şunlar için geçerlidir: SQL Server 2016 (13.x) SP2 ve üzeri.

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

Ayrıca Bkz.

SEÇ (Transact-SQL)
SELECT Örnekleri (Transact-SQL)
INSERT (Transact-SQL)
KİmLİk (İşlev) (Transact-SQL)