Sette inn data

Fullført

Transact-SQL inneholder flere måter å sette inn rader i en tabell på.

INSERT-setningen

INSERT-setningen brukes til å legge til én eller flere rader i en tabell. Det finnes flere former for setningen.

Den grunnleggende syntaksen for en enkel INSERT-setning vises nedenfor:

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

Med denne formen for INSERT-setningen, kalt INSERT VALUES, kan du angi kolonnene som skal ha verdier plassert i dem, og i hvilken rekkefølge dataene skal presenteres for hver rad som settes inn i tabellen. Column_list er valgfritt, men anbefales. Uten column_list forventer INSERT-setningen en verdi for hver kolonne i tabellen i rekkefølgen kolonnene ble definert i. Du kan også angi verdiene for disse kolonnene som en kommadelt liste.

Når du viser verdier, betyr nøkkelordet DEFAULT at en forhåndsdefinert verdi, som ble angitt da tabellen ble opprettet, vil bli brukt. Det finnes tre måter en standard kan fastslås på:

  • Hvis en kolonne er definert til å ha en automatisk generert verdi, brukes denne verdien. Autogenererte verdier diskuteres senere i denne modulen.
  • Når en tabell opprettes, kan en standardverdi angis for en kolonne, og denne verdien brukes hvis STANDARD er angitt.
  • Hvis en kolonne er definert for å tillate NULL-verdier, og kolonnen ikke er en autogenerert kolonne og ikke har en standarddefinert, settes NULL inn som standard.

Detaljene for oppretting av tabeller er utenfor omfanget av denne modulen. Det er imidlertid ofte nyttig å se hvilke kolonner som er i en tabell. Den enkleste måten er å bare utføre en SELECT-setning i tabellen uten å returnere noen rader. Ved å bruke en WHERE-betingelse som aldri kan være SANN, kan ingen rader returneres.

SELECT * FROM Sales.Promotion
WHERE 1 = 0;

Denne setningen viser deg alle kolonnene og navnene deres, men viser ikke datatypene eller noen egenskaper, for eksempel om NULLer er tillatt, eller om det er angitt en standardverdi. Et eksempel på utdataene fra spørringen kan se slik ut:

PromotionName

StartDate

ProductModelID

Rabatt

Notater

Hvis du vil sette inn data i denne tabellen, kan du bruke INSERT-setningen som vist her.

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

I dette eksemplet ovenfor kan kolonnelisten utelates, fordi vi leverer en verdi for hver kolonne i riktig rekkefølge:

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

La oss si at tabellen er definert slik at en standardverdi for gjeldende dato brukes i StartDato-kolonnen , og at Notater-kolonnen tillater NULL-verdier. Du kan angi at du vil bruke disse verdiene eksplisitt, slik som dette:

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

Du kan eventuelt utelate verdier i INSERT-setningen, i så fall brukes standardverdien hvis den er definert, og hvis det ikke finnes noen standardverdi, men kolonnen tillater NULLer, settes en NULL inn. Hvis du ikke angir verdier for alle kolonnene, må du ha en kolonneliste som angir hvilke kolonneverdier du leverer.

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

I tillegg til å sette inn én enkelt rad om gangen, kan INSERT VALUES-setningen brukes til å sette inn flere rader ved å angi flere kommadelte sett med verdier. Verdisettene er også atskilt med komma, slik som dette:

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

Denne listen over verdier kalles en tabellverdikonstruktør. Her er et eksempel på å sette inn to rader til i tabellen med en tabellverdikonstruktør:

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

SETTE INN... VELGE

I tillegg til å angi et litteral sett med verdier i en INSERT-setning, støtter T-SQL også bruk av resultatene fra andre operasjoner for å angi verdier for INSERT. Du kan bruke resultatene av en SELECT-setning eller utdataene fra en lagret prosedyre til å angi verdiene for INSERT-setningen.

Hvis du vil bruke INSERT med en nestet SELECT, bygger du en SELECT-setning for å erstatte VALUES-setningsdelen. Med dette skjemaet, kalt INSERT SELECT, kan du sette inn settet med rader som returneres av en SELECT-spørring, i en måltabell. Bruken av INSERT SELECT presenterer de samme vurderingene som INSERT VALUES:

  • Du kan eventuelt angi en kolonneliste etter tabellnavnet.
  • Du må angi kolonneverdier eller STANDARD, eller NULL, for hver kolonne.

Følgende syntaks illustrerer bruken av INSERT SELECT:

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

Merk deg

Resultatsett fra lagrede prosedyrer (eller dynamiske grupper) kan også brukes som inndata til en INSERT-setning. Denne formen for INSERT, kalt INSERT EXEC, ligner på INSERT SELECT og vil presentere de samme vurderingene. Lagrede prosedyrer kan imidlertid returnere flere resultatsett, så ekstra forsiktighet er nødvendig.

Følgende eksempel setter inn flere rader for en ny kampanje kalt Hent innrammet ved å hente modell-ID-en og modellnavnet fra Production.ProductModel,-tabellen for hver modell som inneholder «ramme» i navnet.

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

I motsetning til en delspørring er ikke nestet SELECT som brukes med en INSERT omsluttet av parenteser.

VELGE... TIL

Et annet alternativ for å sette inn rader, som ligner på INSERT SELECT, er SELECT INTO-setningen. Den største forskjellen mellom INSERT SELECT og SELECT INTO er at SELECT INTO ikke kan brukes til å sette inn rader i en eksisterende tabell, fordi den alltid oppretter en ny tabell som er basert på resultatet av SELECT. Hver kolonne i den nye tabellen har samme navn, datatype og nullabilitet som den tilsvarende kolonnen (eller uttrykket) i SELECT-listen.

Hvis du vil bruke SELECT INTO, legger du til INTO-new_table_name <> i SELECT-setningsdelen i spørringen, like før FROM-setningsdelen. Her er et eksempel som trekker ut data fra Sales.SalesOrderHeader-tabellen i en ny tabell kalt Sales.Invoice..

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

En SELECT INTO vil mislykkes hvis det allerede finnes en tabell med navnet angitt etter INTO. Når tabellen er opprettet, kan den behandles som alle andre tabeller. Du kan velge fra den, koble den til andre tabeller eller sette inn flere rader i den.