Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
A következőkre vonatkozik:SQL Server
Azure SQL Database
Felügyelt Azure SQL-példány
Azure Synapse Analytics
Elemzési platformrendszer (PDW)
Raktár a Microsoft Fabricben
SQL-adatbázis a Microsoft Fabricben
Egy vagy több sort ad hozzá egy táblához vagy nézethez az SQL Serverben. Példákért lásd a Példák című témakört.
Transact-SQL szintaxis konvenciók
Syntax
Az SQL Server és az Azure SQL Database és a Fabric SQL Database szintaxisa
-- Syntax for SQL Server and Azure SQL Database and Fabric SQL database
[ WITH <common_table_expression> [ ,...n ] ]
INSERT
{
[ TOP ( expression ) [ PERCENT ] ]
[ INTO ]
{ <object> | rowset_function_limited
[ WITH ( <Table_Hint_Limited> [ ...n ] ) ]
}
{
[ ( column_list ) ]
[ <OUTPUT Clause> ]
{ VALUES ( { DEFAULT | NULL | expression } [ ,...n ] ) [ ,...n ]
| derived_table
| execute_statement
| <dml_table_source>
| DEFAULT VALUES
}
}
}
[;]
<object> ::=
{
[ server_name . database_name . schema_name .
| database_name .[ schema_name ] .
| schema_name .
]
table_or_view_name
}
<dml_table_source> ::=
SELECT <select_list>
FROM ( <dml_statement_with_output_clause> )
[AS] table_alias [ ( column_alias [ ,...n ] ) ]
[ WHERE <search_condition> ]
[ OPTION ( <query_hint> [ ,...n ] ) ]
-- External tool only syntax
INSERT
{
[BULK]
{ database_name.schema_name.table_or_view_name | schema_name.table_or_view_name | table_or_view_name }
( <column_definition> )
[ WITH (
[ [ , ] CHECK_CONSTRAINTS ]
[ [ , ] FIRE_TRIGGERS ]
[ [ , ] KEEP_NULLS ]
[ [ , ] KILOBYTES_PER_BATCH = kilobytes_per_batch ]
[ [ , ] ROWS_PER_BATCH = rows_per_batch ]
[ [ , ] ORDER ( { column [ ASC | DESC ] } [ ,...n ] ) ]
[ [ , ] TABLOCK ]
) ]
}
[; ] <column_definition> ::=
column_name <data_type>
[ COLLATE collation_name ]
[ NULL | NOT NULL ]
<data type> ::=
[ type_schema_name . ] type_name
[ ( precision [ , scale ] | max ]
Az Azure Synapse Analytics és a párhuzamos adattárház és a Microsoft Fabric Warehouse szintaxisa
-- Syntax for Azure Synapse Analytics and Parallel Data Warehouse and Microsoft Fabric
INSERT [INTO] { database_name.schema_name.table_name | schema_name.table_name | table_name }
[ ( column_name [ ,...n ] ) ]
{
VALUES ( { NULL | expression } )
| SELECT <select_criteria>
}
[ OPTION ( <query_option> [ ,...n ] ) ]
[;]
Arguments
A COMMON_TABLE_EXPRESSION <>
Megadja az INSERT utasítás hatókörében definiált ideiglenes elnevezett eredménykészletet, más néven közös táblakifejezést. Az eredményhalmaz egy SELECT utasításból származik. További információ: WITH common_table_expression (Transact-SQL).
TOP (kifejezés) [ PERCENT ]
Megadja a beszúrni kívánt véletlenszerű sorok számát vagy százalékát.
kifejezés lehet a sorok száma vagy százaléka. További információ: TOP (Transact-SQL).
INTO
Választható kulcsszó, amely az INSERT és a céltábla között használható.
server_name
Az: SQL Server 2008 (10.0.x) és újabb verziókra vonatkozik.
Annak a csatolt kiszolgálónak a neve, amelyen a tábla vagy a nézet található. server_namemegadható csatolt kiszolgálónévként vagy az OPENDATASOURCE függvény használatával.
Ha server_name csatolt kiszolgálóként van megadva, database_name és schema_name kell megadni. Ha server_name az OPENDATASOURCE-val van megadva, előfordulhat, hogy database_name és schema_name nem minden adatforrásra vonatkoznak, és a távoli objektumot elérő OLE DB-szolgáltató képességeire is vonatkoznak.
database_name
Az: SQL Server 2008 (10.0.x) és újabb verziókra vonatkozik.
Az adatbázis neve.
schema_name
Annak a sémának a neve, amelyhez a tábla vagy nézet tartozik.
table_or view_name
Az adatok fogadásához szükséges tábla vagy nézet neve.
A táblaváltozó a hatókörében táblázatforrásként használható az INSERT utasításban.
A table_or_view_name által hivatkozott nézetnek frissíthetőnek kell lennie, és pontosan egy alaptáblára kell hivatkoznia a nézet FROM záradékában. Az INSERT-nek például egy többtáblás nézetben olyan column_list kell használnia, amely csak egy alaptáblából származó oszlopokra hivatkozik. Az frissíthető nézetekről további információt CREATE VIEW (Transact-SQL)című témakörben talál.
rowset_function_limited
Az: SQL Server 2008 (10.0.x) és újabb verziókra vonatkozik.
Az OPENQUERY vagy AZ OPENROWSET függvény. Ezeknek a függvényeknek a használatára a távoli objektumot elérő OLE DB-szolgáltató képességei vonatkoznak.
ÉS ( <table_hint_limited> [... n ] )
Egy vagy több, céltáblához engedélyezett táblamutatót ad meg. A WITH kulcsszó és a zárójelek megadása kötelező.
A READPAST, a NOLOCK és a READUNCOMMITTED nem engedélyezett. További információ a táblázat tippjeiről: Table Hints (Transact-SQL).
Important
Az INSERT-utasítások céltábláira vonatkozó HOLDLOCK, SERIALIZABLE, READCOMMITTED, REPEATABLEREAD vagy UPDLOCK tippek megadásának lehetősége az SQL Server egy későbbi verziójában el lesz távolítva. Ezek a tippek nem befolyásolják az INSERT utasítások teljesítményét. Kerülje a használatukat az új fejlesztési munkában, és tervezze meg a jelenleg használt alkalmazások módosítását.
Az INSERT utasítás céltábláján található TABLOCK-tipp megadása ugyanolyan hatással van, mint a TABLOCKX-tipp megadására. Az asztalra kizárólagos zárolás kerül.
(column_list)
Egy vagy több oszlop listája, amelyekbe adatokat szeretne beszúrni.
column_list zárójelek közé kell tenni, és vesszővel kell elválasztani.
Ha egy oszlop nincs column_list, az adatbázismotornak képesnek kell lennie értéket adni az oszlop definíciója alapján; ellenkező esetben a sor nem tölthető be. Az adatbázismotor automatikusan megadja az oszlop értékét, ha az oszlop:
Identity tulajdonsága van. A rendszer a következő növekményes identitásértéket használja.
Alapértelmezés szerint. A rendszer az oszlop alapértelmezett értékét használja.
Időbélyeg-adattípussal rendelkezik. A rendszer az aktuális időbélyeg-értéket használja.
Null értékű. A rendszer null értéket használ.
Számított oszlop. A program a számított értéket használja.
column_list kell használni, amikor explicit értékeket szúr be egy identitásoszlopba, és a SET IDENTITY_INSERT beállítást be kell kapcsolni a táblához.
OUTPUT záradék
A beszúrt sorokat adja vissza a beszúrási művelet részeként. Az eredmények visszaadhatók a feldolgozó alkalmazásnak, vagy beilleszthetők egy táblázatba vagy táblázatváltozóba további feldolgozás céljából.
Az OUTPUT záradék nem támogatott a helyi particionált nézetekre, elosztott particionált nézetekre, távoli táblákra vagy execute_statement tartalmazó INSERT-utasításokra hivatkozó DML-utasításokban. Az OUTPUT INTO záradék nem támogatott a dml_table_source< záradékot >tartalmazó INSERT-utasításokban. A záradék argumentumairól és viselkedéséről további információt OUTPUT záradék (Transact-SQL)című cikkben talál.
VALUES
Bemutatja a beszúrni kívánt adatértékek listáját vagy listáját. A column_list minden oszlopához egy adatértéknek kell lennie, ha meg van adva, vagy a táblában. Az értéklistát zárójelben kell megadni.
Ha az Érték listában szereplő értékek nem ugyanabban a sorrendben vannak, mint a táblázat oszlopai, vagy nem rendelkeznek a tábla egyes oszlopainak értékével, column_list kell használni az egyes bejövő értékeket tároló oszlop explicit megadásához.
A Transact-SQL sorkonstruktor (más néven táblaérték-konstruktor) használatával több sort is megadhat egyetlen INSERT utasításban. A sorkonstruktor egyetlen VALUES záradékból áll, amely zárójelben, vesszővel elválasztva több értéklistát tartalmaz. További információ: Táblaérték-konstruktor (Transact-SQL).
Note
Az Azure Synapse Analytics nem támogatja a táblaérték-konstruktort.
INSERT Ehelyett több sor beszúrásához további utasítások is végrehajthatók. Az Azure Synapse Analyticsben az értékek beszúrása csak konstans értékek vagy változóhivatkozások lehetnek. Nem konstans beszúrásához állítson be egy változót nem állandó értékre, és szúrja be a változót.
DEFAULT
Kényszeríti az adatbázismotort, hogy betöltse az oszlophoz definiált alapértelmezett értéket. Ha az oszlophoz nem tartozik alapértelmezett érték, és az oszlop null értékeket engedélyez, a null érték be lesz szúrva. Az időbélyeg-adattípussal definiált oszlop esetében a következő időbélyeg-érték lesz beszúrva. Az ALAPÉRTELMEZETT érték nem érvényes identitásoszlopra.
expression
Állandó, változó vagy kifejezés. A kifejezés nem tartalmazhat EXECUTE utasítást.
Az nchar, nvarchar és ntext Unicode-karakter típusú adattípusokra való hivatkozáskor a "kifejezés" előtaggal kell rendelkeznie az "N" nagybetűvel. Ha az "N" nincs megadva, az SQL Server átalakítja a sztringet az adatbázis vagy oszlop alapértelmezett rendezésének megfelelő kódlapra. A kódlapon nem található karakterek elvesznek.
derived_table
Érvényes SELECT utasítás, amely a táblába betöltendő adatsorokat adja vissza. A SELECT utasítás nem tartalmazhat közös táblakifejezést (CTE).
execute_statement
Érvényes EXECUTE utasítás, amely SELECT vagy READTEXT utasításokkal adja vissza az adatokat. További információ: EXECUTE (Transact-SQL).
Az EXECUTE utasítás EREDMÉNYKÉSZLET beállításai nem adhatók meg az INSERT... EXEC utasítás.
Ha az INSERT execute_statement használ, minden eredményhalmaznak kompatibilisnek kell lennie a táblázat oszlopaival vagy column_list.
execute_statement használható tárolt eljárások végrehajtására ugyanazon a kiszolgálón vagy egy távoli kiszolgálón. A távoli kiszolgálón végrehajtja az eljárást, és az eredményhalmazokat a rendszer visszaadja a helyi kiszolgálónak, és betölti a helyi kiszolgáló táblájába. Elosztott tranzakció esetén execute_statement nem lehet kibocsátani egy visszacsatolt csatolt kiszolgálón, ha a kapcsolat több aktív eredményhalmazt (MARS) engedélyez.
Ha execute_statement a READTEXT utasítással adja vissza az adatokat, minden READTEXT utasítás legfeljebb 1 MB (1024 KB) adatot adhat vissza. execute_statement kiterjesztett eljárásokkal is használható. execute_statement beszúrja a kiterjesztett eljárás főszála által visszaadott adatokat; a főszáltól eltérő szálak kimenete azonban nem lesz beszúrva.
Az INSERT EXEC utasítás céljaként nem adható meg táblaértékkel rendelkező paraméter; azonban forrásként megadható az INSERT EXEC sztringben vagy a tárolt eljárásban. További információ: Table-Valued paraméterek (adatbázismotor) használata.
<dml_table_source>
Megadja, hogy a céltáblába beszúrt sorok azok, amelyeket egy INSERT, UPDATE, DELETE vagy MERGE utasítás OUTPUT záradéka ad vissza, opcionálisan WHERE záradékkal szűrve. Ha <dml_table_source> van megadva, a külső INSERT utasítás céljának meg kell felelnie a következő korlátozásoknak:
Alaptáblának kell lennie, nem nézetnek.
Nem lehet távoli tábla.
Nem definiálhat rajta eseményindítókat.
Nem vehet részt elsődleges kulcs-idegen kulcs kapcsolatokban.
Nem vehet részt az egyesítési replikációban vagy a tranzakciós replikációhoz szükséges frissíthető előfizetésekben.
Az adatbázis kompatibilitási szintjét 100-ra vagy annál magasabbra kell állítani. További információ: OUTPUT záradék (Transact-SQL).
<select_list>
Vesszővel tagolt lista, amely megadja, hogy a KIMENETI záradék mely oszlopokat szúrja be. A select_list< oszlopainak >kompatibilisnek kell lenniük azokkal az oszlopokkal, amelyekbe az értékeket beszúrják.
<
> select_list nem hivatkozhat összesítő függvényre vagy TEXTPTR-re.
Note
A SELECT listában felsorolt változók az eredeti értékükre hivatkoznak, függetlenül attól, hogy a dml_statement_with_output_clause< milyen >módosításokat hajtottak végre rajtuk.
<dml_statement_with_output_clause>
Érvényes INSERT, UPDATE, DELETE vagy MERGE utasítás, amely egy OUTPUT záradék érintett sorait adja vissza. Az utasítás nem tartalmazhat WITH záradékot, és nem célozhat távoli táblákat vagy particionált nézeteket. Ha az UPDATE vagy a DELETE meg van adva, akkor nem lehet kurzoralapú UPDATE vagy DELETE. A forrássorok nem hivatkozhatók beágyazott DML-utasításokként.
HOL <search_condition>
A WHERE záradék érvényes search_condition< tartalmaz>, amely szűri a dml_statement_with_output_clause< által visszaadott >sorokat. További információ: Keresési feltétel (Transact-SQL). Ebben a kontextusban <a search_condition> nem tartalmazhatnak olyan al lekérdezéseket, felhasználó által definiált skaláris függvényeket, amelyek adathozzáférést, összesítő függvényeket, TEXTPTR-t vagy teljes szöveges keresési predikátumokat hajtanak végre.
ALAPÉRTELMEZETT ÉRTÉKEK
Az: SQL Server 2008 (10.0.x) és újabb verziókra vonatkozik.
Kényszeríti az új sort, hogy tartalmazza az egyes oszlopokhoz definiált alapértelmezett értékeket.
TERJEDELEM
Az: SQL Server 2008 (10.0.x) és újabb verziókra vonatkozik.
Külső eszközök használják bináris adatfolyam feltöltéséhez. Ez a beállítás nem használható olyan eszközökkel, mint az SQL Server Management Studio, az SQLCMD, az OSQL vagy az adatelérési alkalmazások programozási felületei, például az SQL Server natív ügyfele.
FIRE_TRIGGERS
Az: SQL Server 2008 (10.0.x) és újabb verziókra vonatkozik.
Megadja, hogy a céltáblán definiált beszúrási eseményindítók a bináris adatfolyam feltöltési művelete során futnak. További információ: BULK INSERT (Transact-SQL).
CHECK_CONSTRAINTS
Az: SQL Server 2008 (10.0.x) és újabb verziókra vonatkozik.
Azt határozza meg, hogy a bináris adatfolyam feltöltési művelete során ellenőrizni kell a céltáblára vagy nézetre vonatkozó összes korlátozást. További információ: BULK INSERT (Transact-SQL).
KEEPNULLS
Az: SQL Server 2008 (10.0.x) és újabb verziókra vonatkozik.
Megadja, hogy az üres oszlopoknak null értéket kell tartaniuk a bináris adatfolyam feltöltési művelete során. További információ: Null értékek megtartása vagy alapértelmezett értékek használata tömeges importáláskor (SQL Server)
KILOBYTES_PER_BATCH = kilobytes_per_batch
A kötegenkénti adatok kb. kilobájtos (KB) számát adja meg kilobytes_per_batch. További információ: BULK INSERT (Transact-SQL).
ROWS_PER_BATCH =rows_per_batch
Az: SQL Server 2008 (10.0.x) és újabb verziókra vonatkozik.
A bináris adatfolyamban lévő adatsorok hozzávetőleges számát jelzi. További információ: BULK INSERT (Transact-SQL).
Note
Szintaxishiba akkor jelentkezik, ha nincs megadva oszloplista.
Remarks
Az adatok SQL Graph-táblákba való beszúrásával kapcsolatos információkért lásd az INSERT (SQL Graph) című témakört.
A MAXDOP lekérdezési tipp nem támogatott az INSERT SELECT műveletek során, amikor a SELECT része külső forrásokból olvasható.
Ajánlott eljárások
A @@ROWCOUNT függvénnyel adja vissza a beszúrt sorok számát az ügyfélalkalmazásnak. További információ: @@ROWCOUNT (Transact-SQL).
Ajánlott eljárások az adatok tömeges importálásához
AZ INSERT INTO használata... SELECT to Bulk Import data with minimal logging and parallelism
Segítségével nagy számú sort helyezhet INSERT INTO <target_table> SELECT <columns> FROM <source_table> át hatékonyan egy táblából, például egy átmeneti táblából egy másikba, minimális naplózással. A minimális naplózás javíthatja az utasítás teljesítményét, és csökkentheti annak lehetőségét, hogy a művelet kitöltse a tranzakció során rendelkezésre álló tranzakciónapló-területet.
Az utasítás minimális naplózása a következő követelményekkel rendelkezik:
- Az adatbázis helyreállítási modellje egyszerű vagy tömeges naplózásra van beállítva.
- A céltábla egy üres vagy nem üres halom.
- A céltábla nem használatos a replikációban.
- A
TABLOCKcéltáblához meg van adva a tipp.
A MERGE utasításban a beszúrási művelet eredményeként halomba beszúrt sorok is minimálisan naplózhatók.
BULK INSERT A kevésbé korlátozó tömeges frissítési (BU) zárolást INSERT INTO … SELECT tartalmazó állítástól eltérően a TABLOCK tipp kizárólagos (X) zárolást tartalmaz a táblán. Ez azt jelenti, hogy nem szúrhat be sorokat egyszerre több beszúrási művelettel.
Az SQL Server 2016 (13.x) és az adatbázis kompatibilitási szintje 130-tól kezdve azonban egyetlen INSERT INTO … SELECT utasítás is végrehajtható párhuzamosan a halomba vagy fürtözött oszlopcentrikus indexekbe (CCI) való beszúráskor. A tipp használatakor TABLOCK párhuzamos beszúrások is lehetségesek.
A fenti utasítás párhuzamosságára a következő követelmények vonatkoznak, amelyek hasonlóak a minimális naplózási követelményekhez:
- A céltábla egy üres vagy nem üres halom.
- A céltábla fürtözött oszlopcentrikus indexet (CCI) tartalmaz, de nem fürtözött indexeket nem.
- A céltábla nem tartalmaz identitásoszlopot, IDENTITY_INSERT KI értékre van állítva.
- A
TABLOCKcéltáblához meg van adva a tipp.
A minimális naplózási és párhuzamos beszúrási követelmények teljesülése esetén mindkét fejlesztés együtt fog működni az adatbetöltési műveletek maximális átviteli sebességének biztosítása érdekében.
Az INSERT a Microsoft Fabric-beli raktáron való használatáról további információt a Transact-SQL használatával a Raktárba történő adatbetöltés című témakörben talál.
Note
A helyi ideiglenes táblákba (a #előtag által azonosított) és a globális ideiglenes táblákba (## előtagok által azonosított) beszúrások a TABLOCK-tipp használatával is engedélyezve vannak a párhuzamossághoz.
OPENROWSET és BULK használata adatok tömeges importálásához
Az OPENROWSET függvény a következő táblázatos tippeket fogadja el, amelyek tömeges terhelésoptimalizálást biztosítanak az INSERT utasítással:
- A
TABLOCKtipp minimalizálhatja a beszúrási művelet naplórekordjainak számát. Az adatbázis helyreállítási modelljét egyszerű vagy tömegesen naplózottra kell állítani, és a céltábla nem használható a replikációban. További információ: A tömeges importálás minimális naplózásának előfeltételei. - A
TABLOCKtipp lehetővé teszi a párhuzamos beszúrási műveleteket. A céltábla egy halom vagy fürtözött oszlopcentrikus index (CCI), amely nem fürtözött indexekkel rendelkezik, és a céltábla nem rendelkezhet identitásoszloptal. - A
IGNORE_CONSTRAINTStipp ideiglenesen letilthatja a FOREIGN KEY és a CHECK kényszerellenőrzést. - A
IGNORE_TRIGGERStipp ideiglenesen letilthatja az eseményindító végrehajtását. - A
KEEPDEFAULTStipp lehetővé teszi egy táblaoszlop alapértelmezett értékének beszúrását a NULL helyett, ha az adatrekord nem tartalmaz értéket az oszlophoz. - A
KEEPIDENTITYtipp lehetővé teszi az importált adatfájlban lévő identitásértékek használatát a céltábla identitásoszlopához.
Ezek az optimalizálások hasonlóak a parancsban BULK INSERT elérhetőekhez. További információkért lásd: Tábla-javallatok (Transact-SQL).
Adattípusok
Sorok beszúrásakor vegye figyelembe az alábbi adattípus-viselkedést:
Ha egy érték karakter, varchar vagy varbináris adattípusú oszlopokba van betöltve, a záró üres értékek ( karakter és varchar szóközök, varbináris nullák) kitöltését vagy csonkolását a tábla létrehozásakor az oszlophoz definiált SET ANSI_PADDING beállítás határozza meg. További információ: SET ANSI_PADDING (Transact-SQL).
Az alábbi táblázat a SET ANSI_PADDING OFF alapértelmezett műveletét mutatja be.
Adattípus Alapértelmezett működés char Érték kitöltése szóközökkel a megadott oszlopszélességig. varchar Távolítsa el a záró szóközöket az utolsó nem szóköz karakterre vagy egy szóköz karakterre a csak szóközökből álló sztringek esetében. varbinary Távolítsa el a záró nullákat. Ha egy üres sztring (' ') töltődik be egy varchar vagy szöveges adattípusú oszlopba, az alapértelmezett művelet egy nulla hosszúságú sztring betöltése.
Ha null értéket szúr be egy szöveg - vagy képoszlopba , az nem hoz létre érvényes szövegmutatót, és nem helyez elő 8 KB-os szöveges oldalt sem.
A uniqueidentifier adattípussal létrehozott oszlopok speciálisan formázott 16 bájtos bináris értékeket tárolnak. Az identitásoszlopoktól eltérően az adatbázismotor nem hoz létre automatikusan értékeket a uniqueidentifier adattípusú oszlopokhoz. A beszúrási művelet során a uniqueidentifier adattípusú változók és a xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx formátumú sztringállandók (36 karakter, beleértve a kötőjeleket, ahol x a 0-9 vagy a-f tartomány hexadecimális számjegye) használhatók a uniqueidentifier oszlopokhoz. A 6F9619FF-8B86-D011-B42D-00C04FC964FF például egy uniqueidentifier változó vagy oszlop érvényes értéke. A NEWID() függvénnyel globálisan egyedi azonosítót (GUID) szerezhet be.
Értékek beszúrása User-Defined típusoszlopokba
A felhasználó által megadott típusú oszlopokba a következő módon szúrhat be értékeket:
A felhasználó által megadott típusú érték megadása.
Érték megadása SQL Server-rendszer adattípusban, amennyiben a felhasználó által definiált típus támogatja az adott típus implicit vagy explicit konvertálását. Az alábbi példa bemutatja, hogyan szúrhat be értéket egy felhasználó által definiált típusú
Pointoszlopba egy sztringből való explicit átalakítással.INSERT INTO Cities (Location) VALUES ( CONVERT(Point, '12.3:46.2') );A bináris érték explicit átalakítás nélkül is megadható, mivel minden felhasználó által definiált típus implicit módon konvertálható binárisból.
Felhasználó által definiált függvény meghívása, amely a felhasználó által megadott típusú értéket adja vissza. Az alábbi példa egy felhasználó által definiált függvény
CreateNewPoint()használatával hoz létre egy új, felhasználó által definiált értéketPoint, és beszúrja az értéket aCitiestáblába.INSERT INTO Cities (Location) VALUES ( dbo.CreateNewPoint(x, y) );
Hibakezelés
Az INSERT utasítás hibakezelését úgy valósíthatja meg, hogy megadja az utasítást a TRY... CATCH szerkezet.
Ha az INSERT utasítás megsért egy kényszert vagy szabályt, vagy ha az oszlop adattípusával nem kompatibilis érték van, az utasítás meghiúsul, és hibaüzenet jelenik meg.
Ha az INSERT több sort tölt be a SELECT vagy a EXECUTE használatával, a betöltött értékekből eredő szabály vagy kényszer bármilyen megsértése leállítja az utasítást, és nem tölt be sorokat.
Ha egy INSERT utasítás a kifejezés kiértékelése során aritmetikai hibát (túlcsordulás, nullával való osztás vagy tartományhiba) tapasztal, az adatbázismotor úgy kezeli ezeket a hibákat, mintha a SET ARITHABORT be van állítva. A köteg le van állítva, és a rendszer hibaüzenetet ad vissza. A kifejezés kiértékelése során, ha a SET ARITHABORT és a SET ANSI_WARNINGS ki van kapcsolva, ha egy INSERT, DELETE vagy UPDATE utasítás számtani hibát, túlcsordulást, nullával való osztást vagy tartományhibát tapasztal, az SQL Server null értéket szúr be vagy frissít. Ha a céloszlop nem null értékű, a beszúrási vagy frissítési művelet meghiúsul, és a felhasználó hibaüzenetet kap.
Interoperability
Ha egy INSTEAD OF eseményindítót egy tábla vagy nézet INSERT műveletei határoznak meg, az eseményindító az INSERT utasítás helyett fut. Az INSTEAD OF eseményindítókkal kapcsolatos további információkért lásd: CREATE TRIGGER (Transact-SQL).
Korlátozások és korlátozások
Ha távoli táblákba szúr be értékeket, és nem minden oszlop összes értékét adja meg, azonosítania kell azokat az oszlopokat, amelyekbe a megadott értékeket be szeretné szúrni.
Ha a TOP-t használja az INSERT-ben, a hivatkozott sorok nem rendezhetők semmilyen sorrendben, és az ORDER BY záradék nem adható meg közvetlenül ebben az utasításban. Ha a TOP függvényt kell használnia a sorok értelmes időrendi sorrendbe való beszúrásához, akkor a TOP függvényt kell használnia egy alkijelölési utasításban megadott ORDER BY záradékkal együtt. Tekintse meg a jelen témakörben szereplő Példák szakaszt.
AZ INSERT lekérdezések, amelyek a SELECT és a ORDER BY függvényt használják a sorok kitöltéséhez, garantálják az identitásértékek kiszámítását, a sorok beszúrási sorrendjét azonban nem.
A Párhuzamos adattárházban az ORDER BY záradék érvénytelen a NÉZETEK, a CREATE TABLE AS SELECT, az INSERT SELECT, a beágyazott függvények, a származtatott táblák, az allekérdezések és a közös táblakifejezések esetén, kivéve, ha a TOP is meg van adva.
Naplózási viselkedés
Az INSERT utasítás mindig teljes mértékben naplózva van, kivéve, ha az OPENROWSET függvényt használja a BULK kulcsszóval, vagy ha a függvényt használja INSERT INTO <target_table> SELECT <columns> FROM <source_table>. Ezek a műveletek minimálisan naplózhatók. További információt a jelen témakör korábbi, "Ajánlott eljárások az adatok tömeges betöltéséhez" című szakaszában talál.
Biztonság
A csatolt kiszolgálókapcsolat során a küldő kiszolgáló bejelentkezési nevet és jelszót biztosít a fogadó kiszolgálóhoz való csatlakozáshoz a nevében. Ahhoz, hogy ez a kapcsolat működjön, létre kell hoznia egy bejelentkezési leképezést a csatolt kiszolgálók között a sp_addlinkedsrvlogin használatával.
Az OPENROWSET(BULK...) használatakor fontos tisztában lenni azzal, hogy az SQL Server hogyan kezeli a megszemélyesítést. További információ: "Biztonsági szempontok" a Tömeges adatok importálása TÖMEGES BESZÚRÁS vagy OPENROWSET(BULK...) (SQL Server) használatával című témakörben.
Permissions
INSERT engedély szükséges a céltáblában.
Az INSERT-engedélyek alapértelmezés szerint a sysadmin rögzített kiszolgálói szerepkör, a db_owner rögzített db_datawriter adatbázis-szerepkörök és a táblatulajdonos tagjai. A sysadmin, a db_ownerés a db_securityadmin szerepkörök tagjai és a táblatulajdonos más felhasználók számára is átadhatnak engedélyeket.
Az INSERT OPENROWSET függvény TÖMEGES beállításával való végrehajtásához a rögzített kiszolgálói vagy a sysadminbulkadmin rögzített kiszolgálói szerepkör tagjának kell lennie.
Examples
| Category | Kiemelt szintaxiselemek |
|---|---|
| Alapvető szintaxis | INSERT * táblaérték konstruktor |
| Oszlopértékek kezelése | IDENTITY * NEWID * alapértelmezett értékek * felhasználó által definiált típusok |
| Adatok beszúrása más táblákból | BEILLESZT... SELECT * INSERT... EXECUTE * WITH common table expression * TOP * OFFSET FETCH |
| A standard tábláktól eltérő célobjektumok megadása | Nézetek * táblaváltozók |
| Sorok beszúrása távoli táblába | Csatolt kiszolgáló * OPENQUERY sorkészletfüggvény * OPENDATASOURCE sorkészletfüggvény |
| Adatok tömeges betöltése táblákból vagy adatfájlokból | BEILLESZT... SELECT * OPENROWSET függvény |
| A lekérdezésoptimalizáló alapértelmezett viselkedésének felülbírálása tippek használatával | Tábla javaslatok |
| Az INSERT utasítás eredményeinek rögzítése | OUTPUT záradék |
Alapszintű szintaxis
Az ebben a szakaszban szereplő példák az INSERT utasítás alapvető funkcióit mutatják be a minimálisan szükséges szintaxis használatával.
A. Egyetlen adatsor beszúrása
A következő példa egy sort helyez be az AdventureWorks2025 adatbázis táblázatába Production.UnitMeasure . A táblázat oszlopai a következőkUnitMeasureCode: és NameModifiedDate. Mivel az összes oszlop értékei meg vannak adva, és ugyanabban a sorrendben vannak felsorolva, mint a táblázat oszlopai, az oszlopneveket nem kell megadni az oszloplistában*.*
INSERT INTO Production.UnitMeasure
VALUES (N'FT', N'Feet', '20080414');
B. Több adatsor beszúrása
A következő példa a táblaérték-konstruktorral három sort Production.UnitMeasure fér be az AdventureWorks2025 adatbázisban egyetlen INSERT utasításban. Mivel az összes oszlop értékei meg vannak adva, és ugyanabban a sorrendben vannak felsorolva, mint a táblázat oszlopai, az oszlopneveket nem kell megadni az oszloplistában.
Note
A táblaérték-konstruktor nem támogatott az Azure Synapse Analyticsben.
INSERT INTO Production.UnitMeasure
VALUES (N'FT2', N'Square Feet ', '20080923'), (N'Y', N'Yards', '20080923')
, (N'Y3', N'Cubic Yards', '20080923');
C. Olyan adatok beszúrása, amelyek nem ugyanabban a sorrendben, mint a táblázatoszlopok
Az alábbi példa egy oszloplistát használ az egyes oszlopokba beszúrt értékek explicit megadásával. Az AdventureWorks2025 adatbázis táblázatában az oszlopsorrend Production.UnitMeasure , UnitMeasureCodeName, ModifiedDate; azonban az oszlopok nem szerepelnek ebben a sorrendben column_list-ben.
INSERT INTO Production.UnitMeasure (Name, UnitMeasureCode,
ModifiedDate)
VALUES (N'Square Yards', N'Y2', GETDATE());
Oszlopértékek kezelése
Az ebben a szakaszban szereplő példák bemutatják, hogy milyen módszerekkel szúrhat be értékeket egy IDENTITY tulajdonsággal, ALAPÉRTELMEZETT értékkel vagy adattípusokkal( például uniqueidentifier vagy felhasználó által definiált típusú oszlopokkal) definiált oszlopokba.
D. Adatok beszúrása alapértelmezett értékekkel rendelkező oszlopokkal rendelkező táblába
Az alábbi példa sorokat szúr be egy táblázatba olyan oszlopokkal, amelyek automatikusan létrehoznak egy értéket, vagy alapértelmezett értékkel rendelkeznek.
Column_1 egy számított oszlop, amely automatikusan létrehoz egy értéket úgy, hogy összefűz egy sztringet a beszúrt column_2értékkel.
Column_2 alapértelmezett korlátozással van definiálva. Ha nincs megadva érték ehhez az oszlophoz, a rendszer az alapértelmezett értéket használja.
Column_3 a rowversion adattípussal van definiálva, amely automatikusan létrehoz egy egyedi, növekvő bináris számot.
Column_4 nem hoz létre automatikusan értéket. Ha nincs megadva érték ehhez az oszlophoz, a null érték lesz beszúrva. Az INSERT utasítások olyan sorokat szúrnak be, amelyek bizonyos oszlopok értékeit tartalmazzák, de nem az összeset. Az utolsó INSERT utasításban nincsenek megadva oszlopok, és csak az alapértelmezett értékek lesznek beszúrva az ALAPÉRTELMEZETT ÉRTÉKEK záradékkal.
CREATE TABLE dbo.T1
(
column_1 AS 'Computed column ' + column_2,
column_2 varchar(30)
CONSTRAINT default_name DEFAULT ('my column default'),
column_3 rowversion,
column_4 varchar(40) NULL
);
GO
INSERT INTO dbo.T1 (column_4)
VALUES ('Explicit value');
INSERT INTO dbo.T1 (column_2, column_4)
VALUES ('Explicit value', 'Explicit value');
INSERT INTO dbo.T1 (column_2)
VALUES ('Explicit value');
INSERT INTO T1 DEFAULT VALUES;
GO
SELECT column_1, column_2, column_3, column_4
FROM dbo.T1;
GO
E. Adatok beszúrása egy identitásoszlopot tartalmazó táblába
Az alábbi példa az adatok identitásoszlopba való beszúrásának különböző módszereit mutatja be. Az első két INSERT utasítással identitásértékek hozhatók létre az új sorokhoz. A harmadik INSERT utasítás felülbírálja az oszlop IDENTITY tulajdonságát a SET IDENTITY_INSERT utasítással, és explicit értéket szúr be az identitásoszlopba.
CREATE TABLE dbo.T1 ( column_1 int IDENTITY, column_2 VARCHAR(30));
GO
INSERT T1 VALUES ('Row #1');
INSERT T1 (column_2) VALUES ('Row #2');
GO
SET IDENTITY_INSERT T1 ON;
GO
INSERT INTO T1 (column_1,column_2)
VALUES (-99, 'Explicit identity value');
GO
SELECT column_1, column_2
FROM T1;
GO
F. Adatok beszúrása egy uniqueidentifier oszlopba a NEWID() használatával
Az alábbi példa a NEWID() függvényt használja a GUID lekéréséhez column_2. Az identitásoszlopoktól eltérően az adatbázismotor nem hoz létre automatikusan értékeket a uniqueidentifier adattípusú oszlopokhoz, ahogyan azt a második INSERT utasítás is mutatja.
CREATE TABLE dbo.T1
(
column_1 int IDENTITY,
column_2 uniqueidentifier,
);
GO
INSERT INTO dbo.T1 (column_2)
VALUES (NEWID());
INSERT INTO T1 DEFAULT VALUES;
GO
SELECT column_1, column_2
FROM dbo.T1;
G. Adatok beszúrása felhasználó által definiált típusoszlopokba
Az alábbi Transact-SQL utasítások három sort szúrnak be a PointValuePoints táblázat oszlopába. Ez az oszlop felhasználó által definiált CLR-típust (UDT) használ. A Point adattípus X és Y egész számból áll, amelyek az UDT tulajdonságaiként vannak közzétéve. A vessző által tagolt X és Y értékek Point típusba való beírásához a CAST vagy a CONVERT függvényt kell használnia. Az első két utasítás a KONVERTÁLÁS függvénnyel konvertál egy sztringértéket a Point típusra, a harmadik utasítás pedig a CAST függvényt használja. További információ: Az UDT-adatok manipulálása.
INSERT INTO dbo.Points (PointValue) VALUES (CONVERT(Point, '3,4'));
INSERT INTO dbo.Points (PointValue) VALUES (CONVERT(Point, '1,5'));
INSERT INTO dbo.Points (PointValue) VALUES (CAST ('1,99' AS Point));
Adatok beszúrása más táblákból
Az ebben a szakaszban szereplő példák bemutatják az egyik táblázat sorainak egy másik táblába való beszúrásának módszereit.
H. Adatok beszúrása más táblákból a SELECT és az EXECUTE beállítással
Az alábbi példa bemutatja, hogyan szúrhat be adatokat az egyik táblából egy másik táblába az INSERT... KIJELÖLÉS vagy BESZÚRÁS... KIVÉGEZ. Mindegyik egy többtáblás SELECT utasításon alapul, amely egy kifejezést és egy literális értéket tartalmaz az oszloplistában.
Az első INSERT utasítás egy SELECT utasítást használ, hogy leszárítsa az adatokat az AdventureWorks2025 adatbázis forrástábláiból (Employee, , és Person) és tárolja az eredményhalmazt EmployeeSalesSalesPerson. A második INSERT utasítás az EXECUTE záradékot használja a SELECT utasítást tartalmazó tárolt eljárás meghívására, a harmadik INSERT pedig az EXECUTE záradékot használja a SELECT utasítás literális sztringként való hivatkozására.
CREATE TABLE dbo.EmployeeSales
( DataSource varchar(20) NOT NULL,
BusinessEntityID varchar(11) NOT NULL,
LastName varchar(40) NOT NULL,
SalesDollars money NOT NULL
);
GO
CREATE PROCEDURE dbo.uspGetEmployeeSales
AS
SET NOCOUNT ON;
SELECT 'PROCEDURE', sp.BusinessEntityID, c.LastName,
sp.SalesYTD
FROM Sales.SalesPerson AS sp
INNER JOIN Person.Person AS c
ON sp.BusinessEntityID = c.BusinessEntityID
WHERE sp.BusinessEntityID LIKE '2%'
ORDER BY sp.BusinessEntityID, c.LastName;
GO
--INSERT...SELECT example
INSERT INTO dbo.EmployeeSales
SELECT 'SELECT', sp.BusinessEntityID, c.LastName, sp.SalesYTD
FROM Sales.SalesPerson AS sp
INNER JOIN Person.Person AS c
ON sp.BusinessEntityID = c.BusinessEntityID
WHERE sp.BusinessEntityID LIKE '2%'
ORDER BY sp.BusinessEntityID, c.LastName;
GO
--INSERT...EXECUTE procedure example
INSERT INTO dbo.EmployeeSales
EXECUTE dbo.uspGetEmployeeSales;
GO
--INSERT...EXECUTE('string') example
INSERT INTO dbo.EmployeeSales
EXECUTE
('
SELECT ''EXEC STRING'', sp.BusinessEntityID, c.LastName,
sp.SalesYTD
FROM Sales.SalesPerson AS sp
INNER JOIN Person.Person AS c
ON sp.BusinessEntityID = c.BusinessEntityID
WHERE sp.BusinessEntityID LIKE ''2%''
ORDER BY sp.BusinessEntityID, c.LastName
');
GO
--Show results.
SELECT DataSource,BusinessEntityID,LastName,SalesDollars
FROM dbo.EmployeeSales;
I. A beszúrt adatok definiálása a with common table expression használatával
A következő példa hozza létre a NewEmployee táblázatot az AdventureWorks2025 adatbázisban. Egy közös táblakifejezés (EmployeeTemp) meghatározza a táblázatba NewEmployee beszúrni kívánt egy vagy több tábla sorait. Az INSERT utasítás a közös táblakifejezés oszlopaira hivatkozik.
CREATE TABLE HumanResources.NewEmployee
(
EmployeeID int NOT NULL,
LastName nvarchar(50) NOT NULL,
FirstName nvarchar(50) NOT NULL,
PhoneNumber Phone NULL,
AddressLine1 nvarchar(60) NOT NULL,
City nvarchar(30) NOT NULL,
State nchar(3) NOT NULL,
PostalCode nvarchar(15) NOT NULL,
CurrentFlag Flag
);
GO
WITH EmployeeTemp (EmpID, LastName, FirstName, Phone,
Address, City, StateProvince,
PostalCode, CurrentFlag)
AS (SELECT
e.BusinessEntityID, c.LastName, c.FirstName, pp.PhoneNumber,
a.AddressLine1, a.City, sp.StateProvinceCode,
a.PostalCode, e.CurrentFlag
FROM HumanResources.Employee e
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.PersonPhone AS pp
ON e.BusinessEntityID = pp.BusinessEntityID
INNER JOIN Person.StateProvince AS sp
ON a.StateProvinceID = sp.StateProvinceID
INNER JOIN Person.Person as c
ON e.BusinessEntityID = c.BusinessEntityID
)
INSERT INTO HumanResources.NewEmployee
SELECT EmpID, LastName, FirstName, Phone,
Address, City, StateProvince, PostalCode, CurrentFlag
FROM EmployeeTemp;
GO
J. A TOP használata a forrástáblából beszúrt adatok korlátozásához
Az alábbi példa létrehozza a táblázatot EmployeeSales , és beilleszti az AdventureWorks2025 adatbázis táblázatából származó 5 legjobb véletlenszerű alkalmazott HumanResources.Employee nevét és az év előlegi értékesítési adatait. Az INSERT utasítás az utasítás által visszaadott SELECT 5 sort választja ki. A OUTPUT záradék megjeleníti a táblázatba EmployeeSales beszúrt sorokat. Figyelje meg, hogy a SELECT utasítás ORDER BY záradéka nem a legjobb 5 alkalmazott meghatározására szolgál.
CREATE TABLE dbo.EmployeeSales
( EmployeeID nvarchar(11) NOT NULL,
LastName nvarchar(20) NOT NULL,
FirstName nvarchar(20) NOT NULL,
YearlySales money NOT NULL
);
GO
INSERT TOP(5)INTO dbo.EmployeeSales
OUTPUT inserted.EmployeeID, inserted.FirstName,
inserted.LastName, inserted.YearlySales
SELECT sp.BusinessEntityID, c.LastName, c.FirstName, sp.SalesYTD
FROM Sales.SalesPerson AS sp
INNER JOIN Person.Person AS c
ON sp.BusinessEntityID = c.BusinessEntityID
WHERE sp.SalesYTD > 250000.00
ORDER BY sp.SalesYTD DESC;
Ha a TOP függvényt kell használnia a sorok jelentéses időrendi sorrendbe történő beszúrásához, akkor a TOP és az ORDER BY függvényt kell használnia egy alkijelölési utasításban, ahogyan az az alábbi példában látható. A OUTPUT záradék megjeleníti a táblázatba EmployeeSales beszúrt sorokat. Figyelje meg, hogy az első 5 alkalmazott mostantól az ORDER BY záradék eredményei alapján van beszúrva véletlenszerű sorok helyett.
INSERT INTO dbo.EmployeeSales
OUTPUT inserted.EmployeeID, inserted.FirstName,
inserted.LastName, inserted.YearlySales
SELECT TOP (5) sp.BusinessEntityID, c.LastName, c.FirstName, sp.SalesYTD
FROM Sales.SalesPerson AS sp
INNER JOIN Person.Person AS c
ON sp.BusinessEntityID = c.BusinessEntityID
WHERE sp.SalesYTD > 250000.00
ORDER BY sp.SalesYTD DESC;
A standard tábláktól eltérő célobjektumok megadása
Az ebben a szakaszban szereplő példák bemutatják, hogyan szúrhat be sorokat egy nézet- vagy táblaváltozó megadásával.
K. Adatok beszúrása nézet megadásával
Az alábbi példa egy nézetnevet határoz meg célobjektumként; az új sor azonban be lesz szúrva az alapul szolgáló alaptáblába. Az utasításban szereplő INSERT értékek sorrendjének meg kell egyeznie a nézet oszlopsorrendjének. További információ: Adatok módosítása nézeten keresztül.
CREATE TABLE T1 ( column_1 int, column_2 varchar(30));
GO
CREATE VIEW V1 AS
SELECT column_2, column_1
FROM T1;
GO
INSERT INTO V1
VALUES ('Row 1',1);
GO
SELECT column_1, column_2
FROM T1;
GO
SELECT column_1, column_2
FROM V1;
GO
L. Adatok beszúrása táblázatváltozóba
Az alábbi példa egy táblaváltozót jelöl meg célobjektumként az AdventureWorks2025 adatbázisban.
-- Create the table variable.
DECLARE @MyTableVar table(
LocationID int NOT NULL,
CostRate smallmoney NOT NULL,
NewCostRate AS CostRate * 1.5,
ModifiedDate datetime);
-- Insert values into the table variable.
INSERT INTO @MyTableVar (LocationID, CostRate, ModifiedDate)
SELECT LocationID, CostRate, GETDATE()
FROM Production.Location
WHERE CostRate > 0;
-- View the table variable result set.
SELECT * FROM @MyTableVar;
GO
Sorok beszúrása távoli táblába
Az ebben a szakaszban szereplő példák bemutatják, hogyan szúrhat be sorokat egy távoli céltáblába csatolt kiszolgáló vagy sorkészletfüggvény használatával a távoli táblára való hivatkozáshoz.
M. Adatok beszúrása távoli táblába csatolt kiszolgáló használatával
Az alábbi példa sorokat szúr be egy távoli táblába. A példa a távoli adatforrásra mutató hivatkozás sp_addlinkedserverhasználatával történő létrehozásával kezdődik. A csatolt kiszolgáló neve (MyLinkServer) ezután a négyrészes objektumnév részeként lesz megadva az server.catalog.schema.objectűrlapon.
Az: SQL Server 2008 (10.0.x) és újabb verziókra vonatkozik.
USE master;
GO
-- Create a link to the remote data source.
-- Specify a valid server name for @datasrc as 'server_name'
-- or 'server_nameinstance_name'.
EXEC sp_addlinkedserver @server = N'MyLinkServer',
@srvproduct = N' ',
@provider = N'SQLNCLI',
@datasrc = N'server_name',
@catalog = N'AdventureWorks2022';
GO
-- Specify the remote data source in the FROM clause using a four-part name
-- in the form linked_server.catalog.schema.object.
INSERT INTO MyLinkServer.AdventureWorks2022.HumanResources.Department (Name, GroupName)
VALUES (N'Public Relations', N'Executive General and Administration');
GO
N. Adatok beszúrása távoli táblába az OPENQUERY függvény használatával
Az alábbi példa egy sort szúr be egy távoli táblába az OPENQUERY sorhalmazfüggvény megadásával. Ebben a példában az előző példában létrehozott csatolt kiszolgálónevet használjuk.
Az: SQL Server 2008 (10.0.x) és újabb verziókra vonatkozik.
INSERT OPENQUERY (MyLinkServer,
'SELECT Name, GroupName
FROM AdventureWorks2022.HumanResources.Department')
VALUES ('Environmental Impact', 'Engineering');
GO
O. Adatok beszúrása távoli táblába az OPENDATASOURCE függvény használatával
Az alábbi példa egy sort szúr be egy távoli táblába az OPENDATASOURCE sorkészletfüggvény megadásával. Adjon meg érvényes kiszolgálónevet az adatforráshoz server_name vagy server_name\instance_nameformátum használatával.
Az: SQL Server 2008 (10.0.x) és újabb verziókra vonatkozik.
-- 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_nameinstance_name.
INSERT INTO OPENDATASOURCE('SQLNCLI',
'Data Source= <server_name>; Integrated Security=SSPI')
.AdventureWorks2022.HumanResources.Department (Name, GroupName)
VALUES (N'Standards and Methods', 'Quality Assurance');
GO
P. Beszúrás a PolyBase használatával létrehozott külső táblába
Adatok exportálása AZ SQL Serverről a Hadoopba vagy az Azure Storage-ba. Először hozzon létre egy külső táblát, amely a célfájlra vagy könyvtárra mutat. Ezután az INSERT INTO használatával exportálhat adatokat egy helyi SQL Server-táblából egy külső adatforrásba. Az INSERT INTO utasítás létrehozza a célfájlt vagy könyvtárat, ha az nem létezik, és a SELECT utasítás eredményeit a megadott fájlformátumban exportálja a rendszer a megadott helyre. További információ: A PolyBasehasználatának első lépései.
A következőkre vonatkozik: SQL Server.
-- Create an external table.
CREATE EXTERNAL TABLE [dbo].[FastCustomers2009] (
[FirstName] char(25) NOT NULL,
[LastName] char(25) NOT NULL,
[YearlyIncome] float NULL,
[MaritalStatus] char(1) NOT NULL
)
WITH (
LOCATION='/old_data/2009/customerdata.tbl',
DATA_SOURCE = HadoopHDP2,
FILE_FORMAT = TextFileFormat,
REJECT_TYPE = VALUE,
REJECT_VALUE = 0
);
-- Export data: Move old data to Hadoop while keeping
-- it query-able via external table.
INSERT INTO dbo.FastCustomer2009
SELECT T.* FROM Insured_Customers T1 JOIN CarSensor_Data T2
ON (T1.CustomerKey = T2.CustomerKey)
WHERE T2.YearMeasured = 2009 and T2.Speed > 40;
Adatok tömeges betöltése táblákból vagy adatfájlokból
Az ebben a szakaszban szereplő példák két módszert mutatnak be az adatok táblázatba való tömeges betöltésére az INSERT utasítás használatával.
Q. Adatok beszúrása halomba minimális naplózással
Az alábbi példa létrehoz egy új táblát (egy halom), és minimális naplózással beszúr egy másik táblából származó adatokat. A példa feltételezi, hogy az adatbázis helyreállítási modellje AdventureWorks2025 FULL értékre van állítva. A minimális naplózás érdekében az adatbázis helyreállítási modellje AdventureWorks2025 BULK_LOGGED értékre van állítva a sorok beszúrása előtt, és állítsa vissza a TELJES értékre az INSERT INTO... SELECT utasítás. Emellett a TABLOCK tipp is meg van adva a céltáblához Sales.SalesHistory. Ez biztosítja, hogy az utasítás minimális helyet használ a tranzakciónaplóban, és hatékonyan teljesítsen.
-- Create the target heap.
CREATE TABLE Sales.SalesHistory(
SalesOrderID int NOT NULL,
SalesOrderDetailID int NOT NULL,
CarrierTrackingNumber nvarchar(25) NULL,
OrderQty smallint NOT NULL,
ProductID int NOT NULL,
SpecialOfferID int NOT NULL,
UnitPrice money NOT NULL,
UnitPriceDiscount money NOT NULL,
LineTotal money NOT NULL,
rowguid uniqueidentifier ROWGUIDCOL NOT NULL,
ModifiedDate datetime NOT NULL );
GO
-- Temporarily set the recovery model to BULK_LOGGED.
ALTER DATABASE AdventureWorks2022
SET RECOVERY BULK_LOGGED;
GO
-- Transfer data from Sales.SalesOrderDetail to Sales.SalesHistory
INSERT INTO Sales.SalesHistory WITH (TABLOCK)
(SalesOrderID,
SalesOrderDetailID,
CarrierTrackingNumber,
OrderQty,
ProductID,
SpecialOfferID,
UnitPrice,
UnitPriceDiscount,
LineTotal,
rowguid,
ModifiedDate)
SELECT * FROM Sales.SalesOrderDetail;
GO
-- Reset the recovery model.
ALTER DATABASE AdventureWorks2022
SET RECOVERY FULL;
GO
R. Az OPENROWSET függvény és a BULK együttes használata adatok tömeges betöltéséhez egy táblába
Az alábbi példa egy adatfájl sorait szúrja be egy táblába az OPENROWSET függvény megadásával. A IGNORE_TRIGGERS tábla tippje a teljesítményoptimalizáláshoz van megadva. További példákért lásd: Tömeges adatok importálása TÖMEGES BESZÚRÁS vagy OPENROWSET(BULK...) (SQL Server) használatával.
Az: SQL Server 2008 (10.0.x) és újabb verziókra vonatkozik.
INSERT INTO HumanResources.Department WITH (IGNORE_TRIGGERS) (Name, GroupName)
SELECT b.Name, b.GroupName
FROM OPENROWSET (
BULK 'C:SQLFilesDepartmentData.txt',
FORMATFILE = 'C:SQLFilesBulkloadFormatFile.xml',
ROWS_PER_BATCH = 15000)AS b ;
A lekérdezésoptimalizáló alapértelmezett viselkedésének felülbírálása tippek használatával
Az ebben a szakaszban található példák bemutatják, hogyan használható táblamutatók a lekérdezésoptimalizáló alapértelmezett viselkedésének ideiglenes felülbírálására az INSERT utasítás feldolgozásakor.
Caution
Mivel az SQL Server lekérdezésoptimalizálója általában a legjobb végrehajtási tervet választja ki egy lekérdezéshez, javasoljuk, hogy a tippeket csak a tapasztalt fejlesztők és adatbázis-rendszergazdák használják végső megoldásként.
S. Zárolási módszer megadása a TABLOCK-tipp használatával
Az alábbi példa azt határozza meg, hogy a Production.Location táblában egy kizárólagos (X) zárolást helyeznek el, és az INSERT utasítás végéig tartják.
A következőkre vonatkozik: SQL Server, SQL Database.
INSERT INTO Production.Location WITH (XLOCK)
(Name, CostRate, Availability)
VALUES ( N'Final Inventory', 15.00, 80.00);
Az INSERT utasítás eredményeinek rögzítése
Az ebben a szakaszban szereplő példák bemutatják, hogyan használhatja az OUTPUT záradékot az INSERT utasítás által érintett minden sorból származó információk vagy kifejezések visszaadására. Ezeket az eredményeket vissza lehet adni a feldolgozó alkalmazásnak olyan célokra, mint a megerősítést kérő üzenetek, az archiválás és más ilyen alkalmazáskövetelmények.
T. OUTPUT használata INSERT utasítással
Az alábbi példa beszúr egy sort a ScrapReason táblába, és a OUTPUT záradék használatával visszaadja az utasítás eredményét a @MyTableVar táblaváltozónak. Mivel az ScrapReasonID oszlop tulajdonsággal IDENTITY van definiálva, az adott oszlop utasításában INSERT nincs megadva érték. Vegye figyelembe azonban, hogy az adatbázismotor által az oszlophoz létrehozott érték az oszlop záradékában OUTPUTINSERTED.ScrapReasonID lesz visszaadva.
DECLARE @MyTableVar table( NewScrapReasonID smallint,
Name varchar(50),
ModifiedDate datetime);
INSERT Production.ScrapReason
OUTPUT INSERTED.ScrapReasonID, INSERTED.Name, INSERTED.ModifiedDate
INTO @MyTableVar
VALUES (N'Operator error', GETDATE());
--Display the result set of the table variable.
SELECT NewScrapReasonID, Name, ModifiedDate FROM @MyTableVar;
--Display the result set of the table.
SELECT ScrapReasonID, Name, ModifiedDate
FROM Production.ScrapReason;
U. A KIMENET használata identitással és számított oszlopokkal
Az alábbi példa létrehozza a EmployeeSales táblát, majd több sort szúr be egy INSERT utasítással egy SELECT utasítással a forrástáblák adatainak lekéréséhez. A EmployeeSales táblázat egy identitásoszlopot (EmployeeID) és egy számított oszlopot (ProjectedSales) tartalmaz. Mivel ezeket az értékeket az adatbázismotor hozza létre a beszúrási művelet során, egyik oszlop sem definiálható a fájlban @MyTableVar.
CREATE TABLE dbo.EmployeeSales
( EmployeeID int IDENTITY (1,5)NOT NULL,
LastName nvarchar(20) NOT NULL,
FirstName nvarchar(20) NOT NULL,
CurrentSales money NOT NULL,
ProjectedSales AS CurrentSales * 1.10
);
GO
DECLARE @MyTableVar table(
LastName nvarchar(20) NOT NULL,
FirstName nvarchar(20) NOT NULL,
CurrentSales money NOT NULL
);
INSERT INTO dbo.EmployeeSales (LastName, FirstName, CurrentSales)
OUTPUT INSERTED.LastName,
INSERTED.FirstName,
INSERTED.CurrentSales
INTO @MyTableVar
SELECT c.LastName, c.FirstName, sp.SalesYTD
FROM Sales.SalesPerson AS sp
INNER JOIN Person.Person AS c
ON sp.BusinessEntityID = c.BusinessEntityID
WHERE sp.BusinessEntityID LIKE '2%'
ORDER BY c.LastName, c.FirstName;
SELECT LastName, FirstName, CurrentSales
FROM @MyTableVar;
GO
SELECT EmployeeID, LastName, FirstName, CurrentSales, ProjectedSales
FROM dbo.EmployeeSales;
V. OUTPUT záradékból visszaadott adatok beszúrása
Az alábbi példa egy MERGE utasítás OUTPUT záradékából visszaadott adatokat rögzíti, és beszúrja az adatokat egy másik táblába. A MERGE nyilatkozat naponta frissíti a Quantity táblázat oszlopát ProductInventory az AdventureWorks2025 adatbázisban feldolgozott SalesOrderDetail rendelések alapján. Emellett törli azoknak a termékeknek a sorait is, amelyek készletei 0-ra esnek. A példa rögzíti a törölt sorokat, és beszúrja őket egy másik táblába, ZeroInventoryamely leltár nélküli termékeket követ nyomon.
--Create ZeroInventory table.
CREATE TABLE Production.ZeroInventory (DeletedProductID int, RemovedOnDate DateTime);
GO
INSERT INTO Production.ZeroInventory (DeletedProductID, RemovedOnDate)
SELECT ProductID, GETDATE()
FROM
( MERGE Production.ProductInventory AS pi
USING (SELECT ProductID, SUM(OrderQty) FROM Sales.SalesOrderDetail AS sod
JOIN Sales.SalesOrderHeader AS soh
ON sod.SalesOrderID = soh.SalesOrderID
AND soh.OrderDate = '20070401'
GROUP BY ProductID) AS src (ProductID, OrderQty)
ON (pi.ProductID = src.ProductID)
WHEN MATCHED AND pi.Quantity - src.OrderQty <= 0
THEN DELETE
WHEN MATCHED
THEN UPDATE SET pi.Quantity = pi.Quantity - src.OrderQty
OUTPUT $action, deleted.ProductID) AS Changes (Action, ProductID)
WHERE Action = 'DELETE';
IF @@ROWCOUNT = 0
PRINT 'Warning: No rows were inserted';
GO
SELECT DeletedProductID, RemovedOnDate FROM Production.ZeroInventory;
W. Adatok beszúrása a SELECT beállítással
Az alábbi példa bemutatja, hogyan szúrhat be több adatsort egy INSERT utasítással a SELECT beállítással. Az első INSERT utasítás egy utasítással SELECT közvetlenül kéri le az adatokat a forrástáblából, majd az eredményhalmazt a EmployeeTitles táblában tárolja.
CREATE TABLE EmployeeTitles
( EmployeeKey INT NOT NULL,
LastName varchar(40) NOT NULL,
Title varchar(50) NOT NULL
);
INSERT INTO EmployeeTitles
SELECT EmployeeKey, LastName, Title
FROM ssawPDW.dbo.DimEmployee
WHERE EndDate IS NULL;
X. Címke megadása az INSERT utasítással
Az alábbi példa egy INSERT utasítással rendelkező címke használatát mutatja be.
-- Uses AdventureWorks
INSERT INTO DimCurrency
VALUES (500, N'C1', N'Currency1')
OPTION ( LABEL = N'label1' );
Y. Címke és lekérdezési tipp használata az INSERT utasítással
Ez a lekérdezés az INSERT utasítással egy címke és egy lekérdezésillesztés alapszintaxisát jeleníti meg. Miután a lekérdezést elküldte a vezérlő csomópontnak, a számítási csomópontokon futó SQL Server alkalmazza a kivonat-illesztés stratégiáját az SQL Server lekérdezési tervének létrehozásakor. Az illesztési tippekről és az OPTION záradék használatáról további információt az OPTION (SQL Server PDW) című témakörben talál.
-- Uses AdventureWorks
INSERT INTO DimCustomer (CustomerKey, CustomerAlternateKey,
FirstName, MiddleName, LastName )
SELECT ProspectiveBuyerKey, ProspectAlternateKey,
FirstName, MiddleName, LastName
FROM ProspectiveBuyer p JOIN DimGeography g ON p.PostalCode = g.PostalCode
WHERE g.CountryRegionCode = 'FR'
OPTION ( LABEL = 'Add French Prospects', HASH JOIN);
Lásd még:
Tömeges beszúrás (Transact-SQL)
TÖRLÉS (Transact-SQL)
EXECUTE (Transact-SQL)
FROM (Transact-SQL)
IDENTITÁS (Tulajdonság) (Transact-SQL)
NEWID (Transact-SQL)
VÁLASZT (Transact-SQL)
FRISSÍTÉS (Transact-SQL)
ÖSSZEOLVADÁS (Transact-SQL)
OUTPUT záradék (Transact-SQL)
A beszúrt és törölt táblák használata