SQLShack (Dansk)
Denne artikel dækker SQL INSERT INTO SELECT-sætningen sammen med dens syntaks, eksempler og brugssager.
I min tidligere artikel SQL SELECT INTO Statement undersøgte vi følgende opgaver.
- Opret en SQL-tabel i farten, mens du indsætter poster med passende datatyper
- Brug SQL SELECT INTO til at indsætte poster i en bestemt FileGroup
- Vi kan ikke bruge det til at indsætte data i en eksisterende tabel
INSERT INTO SELECT-sætningen
Vi ønsker at indsætte poster som en almindelig database-aktivitet. Vi kan indsætte data direkte ved hjælp af klientværktøjer såsom SSMS, Azure Data Studio eller direkte fra en applikation. I SQL bruger vi SQL INSERT INTO-sætningen til at indsætte poster.
Syntaksen for INSERT INTO
Når vi indsætter data i tabellen, kan vi bruge følgende syntaks til vores SQL INSERT INTO-sætning.
1
2
|
INDSÆT I tabelnavn (Kolonne1, Kolonne 2 ….)
VÆRDIER (værdi1, værdi2, …);
|
Hvis vi har specificeret alle kolonneværdier pr. tabelkolonne ordrer, behøver vi ikke angive kolonnenavne. Vi kan direkte indsætte poster i tabellen.
1
2
|
INDSÆT I tabelnavn
VÆRDIER (værdi1, værdi2, …);
|
Lad os oprette en eksempeltabel og indsætte data i den .
1
2
3
4
|
OPRET TABEL Medarbejdere
(ID INT,
Navn VARCHAR (20)
);
|
Vi kan indsætte data ved hjælp af følgende forespørgsler. Begge forespørgsler er gyldige til dataindsættelse.
1
2
|
Værdier for medarbejder (ID, navn) (1, “raj”)
Indsæt i medarbejderværdier (2, “raj”)
|
Vi kan ikke indsætte data uden at angive kolonnenavne, hvis der er en uoverensstemmelse mellem dataindsættelse og rækkefølgen af kolonneværdier er forskellig. Vi kan få følgende fejlmeddelelse.
- Msg 213, niveau 16, tilstand 1, linje 6
Kolonnenavn eller antal leverede værdier ikke match tabel definition.
- Msg 245, niveau 16, tilstand 1, linje 6
Konvertering mislykkedes ved konvertering af varchar-værdien raj til datatype int.
I dette eksempel bruger vi SQL INSERT INTO-sætningen med levering af værdier direkte i en sætning. Antag, at vi vil indsætte data fra en anden tabel. Vi kan stadig bruge SQL INSERT INTO-sætningen med en select-sætning. Lad os undersøge dette i det næste afsnit.
INSERT INTO SELECT Statement Syntax
Vi kan indsætte data fra andre SQL-tabeller i en tabel med følgende INSERT INTO SELECT-sætning.
1
2
3
|
INDSÆT I tabel1 (col1, col2, col3,…)
VÆLG col1, col2, col3,…
FRA tabel2
|
Denne forespørgsel udfører følgende opgaver:
- Det vælger først poster fra en tabel (Vælg sætning)
- Derefter indsættes det i en tabel specificeret med INSERT INTO
- Bemærk: Kolonnestrukturen skal matche mellem kolonnen, der returneres af SELECT-sætning og destinationstabel.
INDSÆT I VÆLG eksempler
Eksempel 1: indsæt data fra alle kolonner i kildetabellen til destinationstabellen
Vi har følgende poster i en eksisterende medarbejdertabel.
Lad os oprette en anden tabelkunder med følgende forespørgsel.
1
2
3
4
|
Opret TABEL Kunder
(ID INT,
Navn VARCHAR (20)
);
|
Vi vil indsætte alle poster fra tabellen Medarbejdere til tabellen Kunder. Vi kan bruge SQL INSERT INTO SELECT-sætningen til at gøre dette.
1
2
3
|
INDSÆT I KUNDER
VÆLG *
FRA medarbejdere;
|
Den indsætter alle poster i tabellen Kunder. Vi kan kontrollere, at poster i tabellen Kunder svarer til tabellen medarbejdere.
I dette eksempel indsatte vi poster for alle kolonner til tabellen Kunder.
Eksempel 2: Indsæt rækker fra kilde til destinationstabel ved at angive kolonnenavne
Lad os slippe den eksisterende kundetabel, før vi går videre. Nu vil vi oprette en tabel med en yderligere IDENTITY-kolonne. IDENTITY-kolonnen indsætter automatisk identitetsværdier i en tabel. Vi tilføjede også en bykolonne, der tillader NULL-værdier
1
2
3
4
5
6
|
CREATE TABEL Kunder
(ID INT IDENTITET (1, 1),
Emp_ID INT,
Navn VARCHAR (20),
By VARCHAR (20) NULL,
);
|
Vi kan ikke bruge sætningen INSERT INTO SELECT svarende til ovenstående eksempel. Hvis vi forsøger at køre denne kode, får vi en fejlmeddelelse.
1
2
3
|
INDSÆT I KUNDER
VÆLG *
FRA medarbejdere ;
|
I dette tilfælde skal vi angive kolonnenavnet med INSERT INTO-sætning.
1
2
3
|
INDSÆT I KUNDER (Emp_ID, navn)
VÆLG *
FRA medarbejdere;
|
I tabellen Kunder har vi en ekstra kolonne med tillader NULL-værdier. Lad os køre en Vælg på kunder-tabel. I det følgende skærmbillede kan vi se NULL-værdier i kolonnen By.
Antag at du har en anden kolonne i kildetabellen. Du kan stadig indsætte poster i destinationstabellen med angivelse af kolonnenavne i sætningen INSERT INTO SELECT. Vi skal have en passende datatype til at indsætte data. Du kan ikke indsætte en varchar-kolonnedata i en INT-kolonne.
Tilføj en ny kolonne i tabellen Medarbejdere ved hjælp af ALTER TABLE-sætningen.
1
2
|
ALTER TABLE Medarbejdere
TILFØJ Land varchar (50);
|
Opdater tabeloptegnelserne med landsværdien Indien.
1
|
Opdater medarbejder sæt Land = “Indien”
|
Kør nu INSERT INTO igen VÆLG sætning. Du kan bemærke, at vi bruger SELECT * i stedet for at specificere kolonnenavne.
1
2
3
|
INDSÆT I Kunder (Emp_ID, Navn)
VÆLG *
FRA medarbejdere;
|
Vi får følgende fejlmeddelelse. Denne fejl kommer på grund af kolonnens uoverensstemmelse mellem kildetabellen og destinationstabellen.
Vi kan kortlægge kolonnen mellem kilde- og destinationstabellen ved hjælp af følgende forespørgsel.
1
2
3
4
5
6
|
INDSÆT I KUNDER
(Emp_ID,
Navn
)
VÆLG ID, navn
FRA medarbejdere;
|
Eksempel 3: Indsæt øverste rækker ved hjælp af INSERT INTO SELECT erklæring
Antag, at vi vil indsætte Top N-rækker fra kildetabellen til destinationstabellen. Vi kan bruge Top-klausul i INSERT INTO SELECT-sætningen. I den følgende forespørgsel indsætter den øverste 1 række fra tabellen Medarbejdere til tabellen Kunder.
1
2
3
4
5
6
|
INDSÆT TOP (1) I KUNDER
(Emp_ID,
Navn
)
VÆLG ID, navn
FRA medarbejdere;
|
Eksempel 4: Indsæt ved hjælp af begge kolonner og definerede værdier i SQL INSERT INTO SELECT-erklæringen
I tidligere eksempler specificerede vi enten specifikke værdier i INSERT INTO-udsagnet eller brugte INSERT INTO SELECT til at hente poster fra kildetabellen og indsætte dem i destinationstabellen.
Vi kan kombinere både kolonner og definerede værdier i SQL INSERT INTO SELECT-sætningen.
Vi har følgende kolonner i tabellen Kunder og medarbejdere. Tidligere har vi ikke indsat nogen værdier for kolonnen By. Vi har heller ikke de krævede værdier i tabellen Medarbejder. Vi skal angive en eksplicit værdi for bykolonnen.
I den følgende forespørgsel specificerede vi en værdi for byen kolonnen, mens resten af værdierne vi indsatte fra tabellen Medarbejdere.
1
2
|
INDSÆT TOP (1) I KUNDER (Emp_ID, navn, by)
VÆLG ID, navn, “Delhi” FRA medarbejdere;
|
I den følgende forespørgsel kan vi se, at den indsætter en række (på grund af Top (1) -klausul) sammen med værdi for bykolonnen.
Eksempel 5: INDSÆT I VALG erklæring med Join-klausul for at hente data fra flere tabeller
Vi kan bruge en JOIN-klausul til at hente data fra flere tabeller. Disse tabeller er forbundet med betingelser, der er specificeret med ON-klausulen. Antag, at vi vil hente data fra flere tabeller og indsætte dem i en tabel.
I dette eksempel bruger jeg AdventureWorks2017-databasen. Opret først en ny tabel med passende datatyper.
Denne tabel skal indeholde poster fra output fra en forespørgsel om flere tabeller. Udfør følgende forespørgsel for at indsætte data i tabellen HumanResources.EmployeeData.
Eksempel 6: INDSÆT I SELECT-sætning med fælles tabeludtryk
Vi bruger Common Table Expressions (CTE) til at forenkle kompleks sammenføjning fra flere kolonner. I det foregående eksempel brugte vi JOINS i en Select-sætning til at indsætte data i en SQL-tabel. I denne del omskriver vi forespørgslen med CTE.
I en CTE kan vi dele koden i to dele.
- Vi definerer CTE med en WITH-sætning før SELECT, INSERT, UPDATE, DELETE-sætning
- Når vi først har defineret CTE, kan vi henvise til CTE svarende til en relationel SQL-tabel
Udfør følgende kode for at indsætte data ved hjælp af en CTE.
Eksempel 7 : INSERT INTO SELECT-sætning med en tabelvariabel
Vi bruger tabelvariabler på samme måde som en midlertidig tabel. Vi kan erklære dem ved hjælp af tabeldatatypen. Denne tabel kan bruges til at udføre aktiviteter i SQL Server, hvor vi ikke har brug for en permanent tabel. Du kan dele følgende forespørgsel i tre dele.
- Opret en SQL-tabelvariabel med passende kolonnedatatyper. Vi er nødt til at bruge datatype TABLE til tabelvariabel
- Udfør en INSERT INTO SELECT-sætning for at indsætte data i en tabelvariabel
- Se resultatsættet for tabelvariablen
Konklusion
I denne artikel undersøger vi brugen af INSERT INTO SELECT-sætningen. Jeg håber, du fandt denne artikel nyttig. Du er velkommen til at give feedback i kommentarerne nedenfor.
- Forfatter
- Seneste indlæg
Han er skaberen af en af de største gratis online samlinger af artikler om et enkelt emne med sin 50-dels serie om SQL Server Always On Availability Groups. Baseret på hans bidrag til SQL Server-samfundet er han blevet anerkendt med forskellige priser, herunder den prestigefyldte “Årets bedste forfatter” kontinuerligt i 2020 og 2021 hos SQLShack.
Raj er altid interesseret i nye udfordringer, så hvis du har brug for rådgivning hjælp til ethvert emne, der er dækket af hans skrifter, han kan nås på [email protected]
Se alle indlæg af Rajendra Gupta
- Udfører mindre og større versionopgraderinger til AWS RDS SQL Server – 29. januar 2021
- Implementering af AWS RDS PostgreSQL-forekomster – 27. januar 2021
- Migrering af lokale SQL-databaser til AWS RDS SQL Server ved hjælp af AWS DMS – 25. januar , 2021