Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Platí pro:SQL Server
Azure SQL Database
Spravovaná instance
Azure SQLAzure Synapse Analytics
PdW (Analytics Platform System)
Sklad v Microsoft Fabric
Databáze SQL v Microsoft Fabric
Příkaz SELECT...INTO vytvoří novou tabulku ve výchozí skupině souborů a vloží do ní výsledné řádky z dotazu. Úplnou SELECT syntaxi najdete v tématu SELECT.
Syntax
[ INTO new_table ]
[ ON filegroup ]
Arguments
new_table
Určuje název nové tabulky, která se má vytvořit, na základě sloupců v seznamu výběrů a řádků vybraných ze zdroje dat.
Formát new_table je určen vyhodnocením výrazů v seznamu výběrů. Sloupce v new_table se vytvoří v pořadí určeném seznamem výběru. Každý sloupec v new_table má stejný název, datový typ, hodnotu null a hodnotu jako odpovídající výraz v seznamu výběrů. Vlastnost IDENTITY sloupce je přenesena s výjimkou podmínek definovaných v části Práce se sloupci identity v části Poznámky.
Pokud chcete vytvořit tabulku v jiné databázi na stejné instanci SQL Serveru, zadejte new_table jako plně kvalifikovaný název ve formuláři database.schema.table_name.
Na vzdáleném serveru nemůžete vytvořit new_table . Můžete ale naplnit new_table ze vzdáleného zdroje dat. Chcete-li vytvořit new_table ze vzdálené zdrojové tabulky, zadejte zdrojovou tabulku pomocí názvu čtyřdílné části ve formuláři linked_server. katalog. schéma. object v klauzuli FROMSELECT příkazu. Případně můžete použít funkci OPENQUERY nebo funkci OPENDATASOURCE v FROM klauzuli k určení vzdáleného zdroje dat.
Souborová skupina
Určuje název skupiny souborů, ve které se má nová tabulka vytvořit. Skupina souborů musí existovat v databázi nebo modul SQL Serveru vrátí chybu.
Platí pro: SQL Server 2016 (13.x) SP2 a novější.
Datové typy
Atribut FILESTREAM se nepřenese do nové tabulky. FileSTREAM BLOBs se kopírují a ukládají v nové tabulce jako varbinary(max) BLOBs. Bez atributu FILESTREAM má datový typ varbinary(max) omezení 2 GB. Pokud objekt BLOB FILESTREAM překročí tuto hodnotu, dojde k chybě 7119 a příkaz se zastaví.
Když vyberete existující sloupec identity do nové tabulky, nový sloupec zdědí IDENTITY vlastnost, pokud není splněna jedna z následujících podmínek:
- Příkaz
SELECTobsahuje spojení. - Více
SELECTpříkazů je spojených pomocí .UNION - Sloupec identity je v seznamu výběrů uvedený vícekrát.
- Sloupec identity je součástí výrazu.
- Sloupec identity pochází ze vzdáleného zdroje dat.
Pokud je některá z těchto podmínek pravdivá, vytvoří NOT NULL se sloupec místo dědění IDENTITY vlastnosti. Pokud je sloupec identity povinný v nové tabulce, ale takový sloupec není k dispozici, nebo chcete hodnotu počátečního nebo přírůstku, která se liší od sloupce zdrojové identity, definujte sloupec v seznamu výběrů pomocí IDENTITY funkce. Viz "Vytvoření sloupce identity pomocí IDENTITY funkce" v části Příklady.
Remarks
Příkaz SELECT...INTO funguje ve dvou částech: vytvoří se nová tabulka a pak se vloží řádky. Tento dvoustupňový proces znamená, že pokud vložení selže, operace vrátí zpět všechny vložení, ale nová (prázdná) tabulka zůstane. Pokud potřebujete, aby byla celá operace úspěšná nebo neúspěšná jako celek, použijte explicitní transakci.
Sklad v Microsoft Fabric nepodporuje skupiny souborů. Odkazy a příklady v tomto článku na skupiny souborů se nevztahují na Sklad v Microsoft Fabric.
Omezení
Jako novou tabulku nelze zadat proměnnou tabulky nebo parametr s hodnotou tabulky.
Nemůžete použít SELECT...INTO k vytvoření dělené tabulky, a to ani v případě, že je zdrojová tabulka rozdělená na oddíly.
SELECT...INTO nepoužívá schéma oddílů zdrojové tabulky. Místo toho se nová tabulka vytvoří ve výchozí skupině souborů. Chcete-li vložit řádky do dělené tabulky, musíte nejprve vytvořit dělenou tabulku a pak použít INSERT INTO...SELECT...FROM příkaz.
Indexy, omezení a triggery definované ve zdrojové tabulce se nepřenesou do nové tabulky ani je SELECT...INTO v příkazu nezadají. Pokud tyto objekty potřebujete, můžete je vytvořit po provedení SELECT...INTO příkazu.
Zadání ORDER BY klauzule nezaručuje, že řádky se vloží do zadaného pořadí.
Pokud do seznamu výběru zahrnete řídký sloupec, vlastnost řídký sloupec se nepřenese do sloupce v nové tabulce. Pokud tuto vlastnost potřebujete v nové tabulce, po provedení SELECT...INTO příkazu upravte definici sloupce tak, aby zahrnovala tuto vlastnost.
Pokud do seznamu výběru zahrnete počítaný sloupec, odpovídající sloupec v nové tabulce není vypočítaný sloupec. Hodnoty v novém sloupci jsou hodnoty vypočítané v době SELECT...INTO provedení.
Chování protokolu
Množství protokolování SELECT...INTO závisí na modelu obnovení, který se pro databázi projeví. V rámci jednoduchého modelu obnovení nebo modelu hromadně protokolovaného obnovení se hromadné operace protokolují minimálně. S minimálním protokolováním SELECT...INTO může být příkaz efektivnější než vytvoření tabulky a následné naplnění tabulky příkazem INSERT . Další informace najdete v článku transakčního protokolu .
SELECT...INTO příkazy, které obsahují uživatelem definované funkce (UDF), jsou plně protokolované operace. Pokud uživatelem definované funkce používané příkazem SELECT...INTO neprovádějí žádné operace přístupu k datům, můžete zadat SCHEMABINDING klauzuli pro uživatelem definované funkce. Tato klauzule nastaví odvozenou UserDataAccess vlastnost pro tyto uživatelem definované funkce na 0. Po této změně SELECT...INTO se příkazy zaprotokolují minimálně.
SELECT...INTO Pokud příkaz stále odkazuje alespoň na jednu uživatelem definovanou funkci, která má tuto vlastnost nastavenou na 1, operace je plně protokolována.
Permissions
Vyžaduje CREATE TABLE oprávnění v databázi a ALTER oprávnění ke schématu, ve kterém se tabulka vytváří.
Examples
A. Vytvoření tabulky zadáním sloupců z více zdrojů
Následující příklad vytváří tabulku dbo.EmployeeAddresses v databázi AdventureWorks2025 výběrem sedmi sloupců z různých tabulek týkajících se zaměstnanců a adres.
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. Vkládání řádků pomocí minimálního protokolování
Následující příklad vytvoří tabulku dbo.NewProducts a vloží řádky z Production.Product tabulky. Příklad předpokládá, že model obnovení databáze AdventureWorks2025 je nastaven na FULL. Aby se zajistilo minimální protokolování, je model obnovení databáze AdventureWorks2025 nastavený na BULK_LOGGED před vložením řádků a resetuje ho SELECT...INTO za FULL příkazem. Tento proces zajišťuje, že SELECT...INTO příkaz používá minimální prostor v transakčním protokolu a efektivně provádí.
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. Vytvoření sloupce identity pomocí funkce identity
Následující příklad používá IDENTITY funkci k vytvoření sloupce identity v nové tabulce Person.USAddress v databázi AdventureWorks2025. Tento krok je povinný, protože SELECT příkaz, který definuje tabulku obsahuje spojení, což brání IDENTITY vlastnosti v přenosu do nové tabulky. Počáteční a přírůstkové hodnoty zadané ve IDENTITY funkci se liší od hodnot AddressID sloupce ve zdrojové tabulce Person.Address.
-- 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. Vytvoření tabulky zadáním sloupců ze vzdáleného zdroje dat
Následující příklad ukazuje tři metody vytvoření nové tabulky na místním serveru ze vzdáleného zdroje dat. Příklad začíná vytvořením odkazu na vzdálený zdroj dat. Název MyLinkServer, propojeného serveru je pak zadán v FROM klauzuli prvního SELECT...INTO příkazu a ve OPENQUERY funkci druhého SELECT...INTO příkazu. Třetí SELECT...INTO příkaz používá OPENDATASOURCE funkci, která určuje vzdálený zdroj dat přímo místo použití názvu propojeného serveru.
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. Import z externí tabulky vytvořené pomocí PolyBase
Tento příklad naimportuje data z Hadoopu nebo Azure Storage do SQL Serveru pro trvalé úložiště. Potom používá SELECT INTO k importu dat odkazovaných externí tabulkou pro trvalé úložiště na SQL Serveru. Nakonec za běhu vytvoří relační tabulku a pak v tabulce vytvoří index columnstore.
Platí pro: 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. Zkopírujte data z jedné tabulky do druhé a vytvořte novou tabulku v zadané skupině souborů.
Následující příklad ukazuje vytvoření nové tabulky jako kopii jiné tabulky a její načtení do zadané skupiny souborů odlišné od výchozí skupiny souborů uživatele.
Platí pro: SQL Server 2016 (13.x) SP2 a novější.
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];
Související obsah
- SELECT (Transact-SQL)
- Příklady SELECT (Transact-SQL)
- INSERT (Transact-SQL)
- IDENTITY (funkce) (Transact-SQL)