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
VYBRAT... INTO vytvoří novou tabulku ve výchozí skupině souborů a vloží do ní výsledné řádky z dotazu. Pokud chcete zobrazit úplnou syntaxi SELECT, přečtěte si téma SELECT (Transact-SQL).
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 se přenáší s výjimkou podmínek definovaných v části Poznámky v části Práce se sloupci identity.
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 nelze 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 FROM příkazu SELECT. Případně můžete použít funkci OPENQUERY nebo funkci OPENDATASOURCE v klauzuli FROM k určení vzdáleného zdroje dat.
Souborová skupina
Určuje název skupiny souborů, ve které se vytvoří nová tabulka. Zadaná skupina souborů by měla existovat v databázi, jinak modul SQL Serveru vyvolá 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í.
Pokud je existující sloupec identity vybrán do nové tabulky, nový sloupec dědí vlastnost IDENTITY, pokud není splněna jedna z následujících podmínek:
Příkaz SELECT obsahuje spojení.
Několik příkazů SELECT je spojených pomocí klauzule 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ří se místo dědění vlastnosti IDENTITY sloupec NOT NULL. 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í funkce IDENTITY. Viz část Vytvoření sloupce identity pomocí funkce IDENTITa v části Příklady níže.
Remarks
Příkaz SELECT...INTO funguje ve dvou částech – vytvoří se nová tabulka a pak se vloží řádky. To znamená, že pokud se vložení nezdaří, všechny se vrátí zpět, 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.
Limitace a omezení
Jako novou tabulku nelze zadat proměnnou tabulky nebo parametr s hodnotou tabulky.
Nelze použít SELECT...INTO k vytvoření dělené tabulky, i když 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 nelze zadat v SELECT...INTO příkazu. Pokud jsou tyto objekty povinné, můžete je po provedení SELECT...INTO příkazu vytvořit.
Zadání ORDER BY klauzule nezaručuje, že řádky jsou vloženy do zadaného pořadí.
Pokud je do seznamu výběru zahrnutý řídký sloupec, vlastnost řídký sloupec se nepřenese do sloupce v nové tabulce. Pokud se tato vlastnost vyžaduje v nové tabulce, po spuštění příkazu SELECT upravte definici sloupce... PŘÍKAZ INTO, který má tuto vlastnost zahrnout.
Pokud je počítaný sloupec zahrnutý do seznamu výběrů, 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í.
Logovací chování
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 může být použití příkazu SELECT...INTO efektivnější než vytvoření tabulky a následné naplnění tabulky příkazem INSERT. Další informace naleznete v tématu Transakční protokol (SQL Server).
SELECT...INTO příkazy, které obsahují uživatelem definované funkce (UDF), jsou plně protokolované operace. Pokud uživatelem definované funkce používané v SELECT...INTO příkazu neprovádějí žádné operace přístupu k datům, můžete zadat klauzuli SCHEMABINDING pro uživatelem definované funkce, která nastaví odvozenou vlastnost UserDataAccess pro tyto uživatelem definované funkce na hodnotu 0. Po této změně SELECT...INTO budou příkazy zaprotokolovány minimálně. Pokud příkaz SELECT...INTO 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 oprávnění CREATE TABLE v databázi a oprávnění ALTER 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
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. 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 obnovy databáze AdventureWorks2025 je nastaven na FULL. Aby bylo zajištěno minimální logování, je obnovovací model databáze AdventureWorks2025 nastaven tak, aby BULK_LOGGED před vložením řádků a po SELECT se resetuje na FULL... Prohlášení IN. Tento proces zajistí, že select... Příkaz INTO využívá minimální prostor v transakčním protokolu a efektivně provádí.
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. Vytvoření sloupce identity pomocí funkce IDENTITY
Následující příklad používá funkci IDENTITY k vytvoření sloupce identity v nové tabulce Person.USAddress v databázi AdventureWorks2025. To je povinné, protože příkaz SELECT, který definuje tabulku obsahuje spojení, což způsobí, že vlastnost IDENTITY se nepřenese do nové tabulky. Všimněte si, že počáteční a přírůstkové hodnoty zadané ve funkci IDENTITY se liší od AddressID hodnot 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 propojeného serveru MyLinkServer, se pak zadává v klauzuli FROM prvního příkazu SELECT... PŘÍKAZ INTO a ve funkci OPENQUERY druhého SELECT... PŘÍKAZ INTO. Třetí SELECT... Příkaz INTO používá funkci OPENDATASOURCE, která určuje vzdálený zdroj dat přímo místo použití názvu propojeného serveru.
Platí pro: SQL Server 2008 (10.0.x) a novější
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. Import z externí tabulky vytvořené pomocí PolyBase
Importuje data z Hadoopu nebo Azure Storage do SQL Serveru pro trvalé úložiště. Slouží SELECT INTO k importu dat odkazovaných externí tabulkou pro trvalé úložiště na SQL Serveru. Vytvořte relační tabulku za běhu a pak vytvořte index úložiště sloupců nad tabulkou v druhém kroku.
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. Kopírování dat z jedné tabulky do druhé a vytvoření nové tabulky 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;
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];
Viz také
SELECT (Transact-SQL)
Příklady SELECT (Transact-SQL)
INSERT (Transact-SQL)
IDENTITY (funkce) (Transact-SQL)