Adat beszúrása
A Transact-SQL több módon is beszúrhat sorokat egy táblába.
Az INSERT utasítás
Az INSERT utasítással egy vagy több sort adhat hozzá egy táblához. Az állításnak több formája is van.
Az egyszerű INSERT utasítás alapszintaxisa az alábbiakban látható:
INSERT [INTO] <Table> [(column_list)]
VALUES ([ColumnName or an expression or DEFAULT or NULL],…n)
Az INSERT utasításnak az INSERT VALUES nevű formájával megadhatja azokat az oszlopokat, amelyekben értékek lesznek elhelyezve, valamint azt a sorrendet, amelyben az adatok megjelennek a táblázatba beszúrt egyes sorokhoz. A column_list nem kötelező, de ajánlott. A column_list nélkül az INSERT utasítás a tábla minden oszlopához egy értéket vár abban a sorrendben, amelyben az oszlopokat definiálták. Az oszlopok értékeit vesszővel tagolt listaként is megadhatja.
Az értékek felsorolásakor az ALAPÉRTELMEZETT kulcsszó egy előre definiált értéket jelent, amely a tábla létrehozásakor lett megadva. Az alapértelmezett érték háromféleképpen határozható meg:
- Ha egy oszlopot automatikusan generált értékként definiáltak, a rendszer ezt az értéket fogja használni. Az automatikusan létrehozott értékeket a modul későbbi részében tárgyaljuk.
- Tábla létrehozásakor megadhat egy alapértelmezett értéket egy oszlophoz, és ezt az értéket fogja használni, ha az ALAPÉRTELMEZETT beállítás meg van adva.
- Ha egy oszlop a NULL értékek engedélyezésére lett definiálva, és az oszlop nem automatikusan létrehozott oszlop, és nincs megadva alapértelmezett érték, a NULL alapértelmezett értékként lesz beszúrva.
A táblázatlétrehozás részletei túlmutatnak a modul hatókörén. Gyakran azonban hasznos látni, hogy milyen oszlopok találhatók egy táblában. A legegyszerűbben úgy hajthat végre select utasítást a táblán, hogy nem ad vissza sorokat. Ha olyan WHERE feltételt használ, amely soha nem lehet IGAZ, nem adható vissza sor.
SELECT * FROM Sales.Promotion
WHERE 1 = 0;
Ez az utasítás megjeleníti az összes oszlopot és azok nevét, de nem jeleníti meg az adattípusokat vagy tulajdonságokat, például azt, hogy engedélyezve vannak-e a NULL-ek, vagy hogy van-e megadva alapértelmezett érték. Egy példa a lekérdezés kimenetére a következőképpen nézhet ki:
PromotionLabel
StartDate
ProductModelID
Árengedmény
Jegyzetek
Ha adatokat szeretne beszúrni ebbe a táblába, használja az INSERT utasítást az itt látható módon.
INSERT INTO Sales.Promotion (PromotionName,StartDate,ProductModelID,Discount,Notes)
VALUES
('Clearance Sale', '01/01/2021', 23, 0.1, '10% discount');
A fenti példában az oszloplista kihagyható, mert minden oszlophoz a megfelelő sorrendben adunk értéket:
INSERT INTO Sales.Promotion
VALUES
('Clearance Sale', '01/01/2021', 23, 0.1, '10% discount');
Tegyük fel, hogy a tábla úgy van definiálva, hogy a rendszer az aktuális dátum alapértelmezett értékét alkalmazza a StartDate oszlopra, a Jegyzetek oszlop pedig null értékeket engedélyez. Jelezheti, hogy explicit módon szeretné használni ezeket az értékeket, például a következőt:
INSERT INTO Sales.Promotion
VALUES
('Pull your socks up', DEFAULT, 24, 0.25, NULL);
Másik lehetőségként kihagyhat értékeket az INSERT utasításból, ebben az esetben az alapértelmezett érték lesz használva, ha meg van adva, és ha nincs alapértelmezett érték, de az oszlop engedélyezi a NULL-eket, akkor a program null értéket szúr be. Ha nem minden oszlophoz ad meg értékeket, egy oszloplistával kell rendelkeznie, amely jelzi, hogy mely oszlopértékeket adja meg.
INSERT INTO Sales.Promotion (PromotionName, ProductModelID, Discount)
VALUES
('Caps Locked', 2, 0.2);
Amellett, hogy egyszerre egyetlen sort szúr be, az INSERT VALUES utasítással több sort is beszúrhat több vesszővel tagolt értékkészlet biztosításával. Az értékhalmazokat vesszők is elválasztják, például:
(col1_val,col2_val,col3_val),
(col1_val,col2_val,col3_val)
Ez az értéklista táblaérték-konstruktorként ismert. Íme egy példa arra, hogy két további sort szúr be a táblázatba egy táblaérték konstruktorával:
INSERT INTO Sales.Promotion
VALUES
('The gloves are off!', DEFAULT, 3, 0.25, NULL),
('The gloves are off!', DEFAULT, 4, 0.25, NULL);
BEILLESZT... KIVÁLASZT
Az INSERT utasításban szereplő értékek konstans készletének megadása mellett a T-SQL más műveletek eredményeinek használatát is támogatja az INSERT értékeinek megadásához. Az INSERT utasítás értékeinek megadásához használhatja a SELECT utasítás eredményeit vagy egy tárolt eljárás kimenetét.
Ha az INSERT függvényt beágyazott SELECT-szel szeretné használni, hozzon létre egy SELECT utasítást a VALUES záradék helyére. Ezzel az INSERT SELECT nevű űrlappal beszúrhatja a SELECT lekérdezés által visszaadott sorokat egy céltáblába. Az INSERT SELECT használata ugyanazokat a szempontokat mutatja be, mint az INSERT VALUES:
- A tábla neve után megadhat oszloplistát is.
- Minden oszlophoz meg kell adnia az oszlopértékeket, illetve a DEFAULT vagy a NULL értéket.
Az alábbi szintaxis az INSERT SELECT használatát szemlélteti:
INSERT [INTO] <table or view> [(column_list)]
SELECT <column_list> FROM <table_list>...;
Feljegyzés
A tárolt eljárásokból (vagy akár dinamikus kötegekből) származó eredményhalmazok is használhatók az INSERT utasítás bemeneteként. Ez az INSERT,más néven INSERT EXEC forma fogalmilag hasonló az INSERT SELECT-hez, és ugyanazokat a szempontokat fogja figyelembe venni. A tárolt eljárások azonban több eredményhalmazt is visszaadhatnak, ezért további ápolásra van szükség.
Az alábbi példa több sort szúr be egy Get Framed nevű új előléptetéshez, ha beolvassa a modellazonosítót és a modell nevét a Production.ProductModel táblából minden olyan modellhez, amely a nevében a "keret" szót tartalmazza.
INSERT INTO Sales.Promotion (PromotionName, ProductModelID, Discount, Notes)
SELECT DISTINCT 'Get Framed', m.ProductModelID, 0.1, '10% off ' + m.Name
FROM Production.ProductModel AS m
WHERE m.Name LIKE '%frame%';
Az al lekérdezésekkel ellentétben az INSERT-hez használt beágyazott SELECT nem zárójelben van.
KIVÁLASZT... BA
A SOROK BESZÚRÁSA utasításhoz hasonló sorok beszúrására szolgáló másik lehetőség a SELECT INTO utasítás. A SELECT és a SELECT INTO beszúrása közötti legnagyobb különbség az, hogy a SELECT INTO nem használható sorok beszúrására egy meglévő táblába, mert mindig létrehoz egy új táblát, amely a SELECT eredménye alapján jön létre. Az új tábla minden oszlopának neve, adattípusa és nullképessége megegyezik a SELECT lista megfelelő oszlopával (vagy kifejezésével).
A SELECT INTO használatához adja hozzá az INTO <new_table_name> a lekérdezés SELECT záradékában, a FROM záradék előtt. Íme egy példa, amely adatokat nyer ki a Sales.SalesOrderHeader táblából egy Új, Sales.Invoice nevű táblába.
SELECT SalesOrderID, CustomerID, OrderDate, PurchaseOrderNumber, TotalDue
INTO Sales.Invoice
FROM Sales.SalesOrderHeader;
A SELECT INTO sikertelen lesz, ha már van olyan tábla, amelynek a neve az INTO után van megadva. A tábla létrehozása után bármely más táblához hasonlóan kezelhető. Választhat belőle, más táblákhoz illesztheti, vagy további sorokat szúrhat be.