Infoga data
Transact-SQL tillhandahåller flera sätt att infoga rader i en tabell.
INSERT-instruktionen
INSERT-instruktionen används för att lägga till en eller flera rader i en tabell. Det finns flera former av -instruktionen.
Den grundläggande syntaxen för en enkel INSERT-instruktion visas nedan:
INSERT [INTO] <Table> [(column_list)]
VALUES ([ColumnName or an expression or DEFAULT or NULL],…n)
Med den här formen av INSERT-instruktionen, som kallas INSERT VALUES, kan du ange de kolumner som ska ha värden placerade i dem och i vilken ordning data ska visas för varje rad som infogas i tabellen. Column_list är valfritt men rekommenderas. Utan column_list förväntar sig INSERT-instruktionen ett värde för varje kolumn i tabellen i den ordning som kolumnerna definierades. Du kan också ange värdena för dessa kolumner som en kommaavgränsad lista.
När du listar värden innebär nyckelordet DEFAULT att ett fördefinierat värde som angavs när tabellen skapades används. Det finns tre sätt att fastställa ett standardvärde:
- Om en kolumn har definierats för att ha ett automatiskt genererat värde används det värdet. Autogenererade värden beskrivs senare i den här modulen.
- När en tabell skapas kan ett standardvärde anges för en kolumn och det värdet används om STANDARD anges.
- Om en kolumn har definierats för att tillåta NULL-värden och kolumnen inte är en automatiskt genererad kolumn och inte har någon standarddefinierad, infogas NULL som standard.
Informationen om hur du skapar tabeller ligger utanför omfånget för den här modulen. Det är dock ofta användbart att se vilka kolumner som finns i en tabell. Det enklaste sättet är att bara köra en SELECT-instruktion i tabellen utan att returnera några rader. Genom att använda ett WHERE-villkor som aldrig kan vara TRUE kan inga rader returneras.
SELECT * FROM Sales.Promotion
WHERE 1 = 0;
Den här instruktionen visar alla kolumner och deras namn, men visar inte datatyperna eller några egenskaper, till exempel om NULL:er tillåts eller om det finns angivna standardvärden. Ett exempel på utdata från frågan kan se ut så här:
PromotionName
StartDate
ProductModelID
Discount
Kommentar
Om du vill infoga data i den här tabellen kan du använda INSERT-instruktionen som du ser här.
INSERT INTO Sales.Promotion (PromotionName,StartDate,ProductModelID,Discount,Notes)
VALUES
('Clearance Sale', '01/01/2021', 23, 0.1, '10% discount');
I det här exemplet ovan kan kolumnlistan utelämnas eftersom vi anger ett värde för varje kolumn i rätt ordning:
INSERT INTO Sales.Promotion
VALUES
('Clearance Sale', '01/01/2021', 23, 0.1, '10% discount');
Anta att tabellen har definierats så att ett standardvärde för det aktuella datumet tillämpas på kolumnen StartDate och att kolumnen Anteckningar tillåter NULL-värden. Du kan ange att du vill använda dessa värden explicit, så här:
INSERT INTO Sales.Promotion
VALUES
('Pull your socks up', DEFAULT, 24, 0.25, NULL);
Du kan också utelämna värden i INSERT-instruktionen, i vilket fall standardvärdet används om det definieras, och om det inte finns något standardvärde men kolumnen tillåter NULLs infogas en NULL. Om du inte anger värden för alla kolumner måste du ha en kolumnlista som anger vilka kolumnvärden du anger.
INSERT INTO Sales.Promotion (PromotionName, ProductModelID, Discount)
VALUES
('Caps Locked', 2, 0.2);
Förutom att infoga en enskild rad i taget kan instruktionen INSERT VALUES användas för att infoga flera rader genom att tillhandahålla flera kommaavgränsade uppsättningar med värden. Uppsättningarna med värden avgränsas också med kommatecken, så här:
(col1_val,col2_val,col3_val),
(col1_val,col2_val,col3_val)
Den här listan med värden kallas för en tabellvärdekonstruktor. Här är ett exempel på hur du infogar ytterligare två rader i tabellen med en tabellvärdekonstruktor:
INSERT INTO Sales.Promotion
VALUES
('The gloves are off!', DEFAULT, 3, 0.25, NULL),
('The gloves are off!', DEFAULT, 4, 0.25, NULL);
INFOGA... UTVALD
Förutom att ange en literal uppsättning värden i en INSERT-instruktion har T-SQL även stöd för att använda resultatet av andra åtgärder för att ange värden för INSERT. Du kan använda resultatet av en SELECT-instruktion eller utdata från en lagrad procedur för att ange värdena för INSERT-instruktionen.
Om du vill använda INSERT med en kapslad SELECT skapar du en SELECT-instruktion för att ersätta VALUES-satsen. Med det här formuläret, som kallas INSERT SELECT, kan du infoga uppsättningen rader som returneras av en SELECT-fråga i en måltabell. Användningen av INSERT SELECT visar samma överväganden som INSERT VALUES:
- Du kan också ange en kolumnlista efter tabellnamnet.
- Du måste ange kolumnvärden eller STANDARD, eller NULL, för varje kolumn.
Följande syntax illustrerar användningen av INSERT SELECT:
INSERT [INTO] <table or view> [(column_list)]
SELECT <column_list> FROM <table_list>...;
Kommentar
Resultatuppsättningar från lagrade procedurer (eller till och med dynamiska batchar) kan också användas som indata till en INSERT-instruktion. Den här formen av INSERT, som kallas INSERT EXEC, liknar INSERT SELECT konceptuellt och visar samma överväganden. Lagrade procedurer kan dock returnera flera resultatuppsättningar, så extra försiktighet krävs.
I följande exempel infogas flera rader för en ny kampanj med namnet Get Framed genom att hämta modell-ID:t och modellnamnet från Production.ProductModel, tabell för varje modell som innehåller "frame" i namnet.
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%';
Till skillnad från en underfråga omges inte den kapslade SELECT som används med en INSERT i parenteser.
UTVALD... IN
Ett annat alternativ för att infoga rader, som liknar INSERT SELECT, är SELECT INTO-instruktionen. Den största skillnaden mellan INSERT SELECT och SELECT INTO är att SELECT INTO inte kan användas för att infoga rader i en befintlig tabell, eftersom den alltid skapar en ny tabell som baseras på resultatet av SELECT. Varje kolumn i den nya tabellen har samma namn, datatyp och nullbarhet som motsvarande kolumn (eller uttryck) i SELECT-listan.
Om du vill använda SELECT INTO lägger du till INTO <new_table_name> i SELECT-satsen i frågan, precis före FROM-satsen. Här är ett exempel som extraherar data från tabellen Sales.SalesOrderHeader till en ny tabell med namnet Sales.Invoice.
SELECT SalesOrderID, CustomerID, OrderDate, PurchaseOrderNumber, TotalDue
INTO Sales.Invoice
FROM Sales.SalesOrderHeader;
En SELECT INTO misslyckas om det redan finns en tabell med namnet som angetts efter INTO. När tabellen har skapats kan den behandlas som vilken annan tabell som helst. Du kan välja från den, koppla den till andra tabeller eller infoga fler rader i den.