Gegevens invoegen

Voltooid

Transact-SQL biedt meerdere manieren om rijen in een tabel in te voegen.

De INSERT-instructie

De INSERT-instructie wordt gebruikt om een of meer rijen aan een tabel toe te voegen. Er zijn verschillende vormen van de verklaring.

De basissyntaxis van een eenvoudige INSERT-instructie wordt hieronder weergegeven:

INSERT [INTO] <Table> [(column_list)]
VALUES ([ColumnName or an expression or DEFAULT or NULL],…n)

Met deze vorm van de instructie INSERT, INSERT VALUES genaamd, kunt u de kolommen opgeven waarin waarden worden geplaatst en de volgorde waarin de gegevens worden weergegeven voor elke rij die in de tabel is ingevoegd. De column_list is optioneel, maar wordt aanbevolen. Zonder de column_list verwacht de instructie INSERT een waarde voor elke kolom in de tabel in de volgorde waarin de kolommen zijn gedefinieerd. U kunt de waarden voor deze kolommen ook opgeven als een door komma's gescheiden lijst.

Bij het weergeven van waarden betekent het trefwoord DEFAULT een vooraf gedefinieerde waarde, die is opgegeven toen de tabel werd gemaakt, wordt gebruikt. Er zijn drie manieren waarop een standaardinstelling kan worden bepaald:

  • Als een kolom is gedefinieerd om een automatisch gegenereerde waarde te hebben, wordt die waarde gebruikt. Automatisch gegenereerde waarden worden verderop in deze module besproken.
  • Wanneer een tabel wordt gemaakt, kan er een standaardwaarde worden opgegeven voor een kolom. Deze waarde wordt gebruikt als STANDAARD is opgegeven.
  • Als een kolom is gedefinieerd om NULL-waarden toe te staan en de kolom geen automatisch gegenereerde kolom is en geen standaardwaarde heeft gedefinieerd, wordt NULL als standaard ingevoegd.

De details van het maken van tabellen vallen buiten het bereik van deze module. Het is echter vaak handig om te zien welke kolommen zich in een tabel bevinden. De eenvoudigste manier is om alleen een SELECT-instructie uit te voeren in de tabel zonder rijen te retourneren. Als u een WHERE-voorwaarde gebruikt die nooit WAAR kan zijn, kunnen er geen rijen worden geretourneerd.

SELECT * FROM Sales.Promotion
WHERE 1 = 0;

In deze instructie worden alle kolommen en hun namen weergegeven, maar worden de gegevenstypen of eigenschappen niet weergegeven, zoals of NULL's zijn toegestaan of als er een standaardwaarde is opgegeven. Een voorbeeld van de uitvoer van de query kan er als volgt uitzien:

PromotionName

StartDate

ProductModelID

Discount

Opmerkingen

Als u gegevens in deze tabel wilt invoegen, kunt u de instructie INSERT gebruiken, zoals hier wordt weergegeven.

INSERT INTO Sales.Promotion (PromotionName,StartDate,ProductModelID,Discount,Notes)
VALUES
('Clearance Sale', '01/01/2021', 23, 0.1, '10% discount');

In dit voorbeeld hierboven kan de kolomlijst worden weggelaten, omdat we een waarde opgeven voor elke kolom in de juiste volgorde:

INSERT INTO Sales.Promotion
VALUES
('Clearance Sale', '01/01/2021', 23, 0.1, '10% discount');

Stel dat de tabel zodanig is gedefinieerd dat een standaardwaarde van de huidige datum wordt toegepast op de kolom Begindatum en dat de kolom Notities NULL-waarden toestaat. U kunt aangeven dat u deze waarden expliciet wilt gebruiken, zoals hieronder:

INSERT INTO Sales.Promotion
VALUES
('Pull your socks up', DEFAULT, 24, 0.25, NULL);

U kunt ook waarden weglaten in de instructie INSERT. In dat geval wordt de standaardwaarde gebruikt als deze is gedefinieerd en als er geen standaardwaarde is, maar de kolom NULL's toestaat, wordt er een NULL ingevoegd. Als u geen waarden opgeeft voor alle kolommen, moet u een kolomlijst hebben die aangeeft welke kolomwaarden u opgeeft.

INSERT INTO Sales.Promotion (PromotionName, ProductModelID, Discount)
VALUES
('Caps Locked', 2, 0.2);

Naast het invoegen van één rij tegelijk, kan de instructie INSERT VALUES worden gebruikt om meerdere rijen in te voegen door meerdere door komma's gescheiden sets waarden op te geven. De sets waarden worden ook gescheiden door komma's, zoals deze:

(col1_val,col2_val,col3_val),
(col1_val,col2_val,col3_val)

Deze lijst met waarden wordt een tabelwaardeconstructor genoemd. Hier volgt een voorbeeld van het invoegen van twee rijen in de tabel met een tabelwaardeconstructor:

INSERT INTO Sales.Promotion
VALUES
('The gloves are off!', DEFAULT, 3, 0.25, NULL),
('The gloves are off!', DEFAULT, 4, 0.25, NULL);

INVOEGEN... SELECTEREN

Naast het opgeven van een letterlijke set waarden in een INSERT-instructie, biedt T-SQL ook ondersteuning voor het gebruik van de resultaten van andere bewerkingen om waarden voor INSERT op te geven. U kunt de resultaten van een SELECT-instructie of de uitvoer van een opgeslagen procedure gebruiken om de waarden voor de INSERT-instructie op te geven.

Als u INSERT wilt gebruiken met een geneste SELECT, bouwt u een SELECT-instructie om de COMPONENT VALUES te vervangen. Met dit formulier, INSERT SELECT genaamd, kunt u de set rijen invoegen die door een SELECT-query worden geretourneerd in een doeltabel. Het gebruik van INSERT SELECT biedt dezelfde overwegingen als INSERT VALUES:

  • U kunt desgewenst een kolomlijst opgeven na de tabelnaam.
  • U moet kolomwaarden of STANDAARD of NULL opgeven voor elke kolom.

De volgende syntaxis illustreert het gebruik van INSERT SELECT:

INSERT [INTO] <table or view> [(column_list)]
SELECT <column_list> FROM <table_list>...;

Notitie

Resultaatsets van opgeslagen procedures (of zelfs dynamische batches) kunnen ook worden gebruikt als invoer voor een INSERT-instructie. Deze vorm van INSERT, INSERT EXEC, is conceptueel vergelijkbaar met INSERT SELECT en zal dezelfde overwegingen opleveren. Opgeslagen procedures kunnen echter meerdere resultatensets retourneren, dus er is extra zorg nodig.

In het volgende voorbeeld worden meerdere rijen ingevoegd voor een nieuwe promotie met de naam Get Framed door de model-id en modelnaam op te halen uit de tabel Production.ProductModel, voor elk model dat frame bevat in de naam.

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%';

In tegenstelling tot een subquery wordt de geneste SELECT die wordt gebruikt met een INSERT niet tussen haakjes geplaatst.

SELECTEREN... IN

Een andere optie voor het invoegen van rijen, vergelijkbaar met INSERT SELECT, is de INSTRUCTIE SELECT INTO. Het grootste verschil tussen INSERT SELECT en SELECT INTO is dat SELECT INTO niet kan worden gebruikt om rijen in een bestaande tabel in te voegen, omdat er altijd een nieuwe tabel wordt gemaakt die is gebaseerd op het resultaat van de SELECT. Elke kolom in de nieuwe tabel heeft dezelfde naam, hetzelfde gegevenstype en een null-waarde als de bijbehorende kolom (of expressie) in de SELECT-lijst.

Als u SELECT INTO wilt gebruiken, voegt u INTO <new_table_name> toe in de SELECT-component van de query, net vóór de FROM-component. Hier volgt een voorbeeld waarmee gegevens uit de tabel Sales.SalesOrderHeader worden geëxtraheerd in een nieuwe tabel met de naam Sales.Invoice..

SELECT SalesOrderID, CustomerID, OrderDate, PurchaseOrderNumber, TotalDue
INTO Sales.Invoice
FROM Sales.SalesOrderHeader;

Een SELECT INTO mislukt als er al een tabel is met de naam die na INTO is opgegeven. Nadat de tabel is gemaakt, kan deze worden behandeld als elke andere tabel. U kunt er een selectie van maken, deze samenvoegen met andere tabellen of er meer rijen in invoegen.