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.

  1. Vi definerer CTE med en WITH-sætning før SELECT, INSERT, UPDATE, DELETE-sætning
  2. 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.

  1. Opret en SQL-tabelvariabel med passende kolonnedatatyper. Vi er nødt til at bruge datatype TABLE til tabelvariabel
  2. Udfør en INSERT INTO SELECT-sætning for at indsætte data i en tabelvariabel
  3. 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
Som MCSA-certificeret og Microsoft Certified Trainer i Gurgaon, Indien, med 13 års erfaring, arbejder Rajendra for en række store virksomheder med fokus på præstationsoptimering, overvågning, høj tilgængelighed og katastrofegendannelsesstrategier og implementering. Han er forfatter til hundredvis af autoritative artikler om SQL Server, Azure, MySQL, Linux, Power BI, Performance tuning, AWS / Amazon RDS, Git og relaterede teknologier, der er blevet set af over 10m læsere til dato.
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

Seneste indlæg af Rajendra Gupta (se alle)
  • 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

Skriv et svar

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *