SQLShack (Nederlands)

Dit artikel behandelt de SQL INSERT INTO SELECT statement samen met de syntaxis, voorbeelden en use cases.

In mijn eerdere artikel SQL SELECT INTO Statement hebben we de volgende taken onderzocht.

  • Creëer direct een SQL-tabel terwijl je records met de juiste gegevenstypen invoegt
  • Gebruik SQL SELECT INTO om records in een bepaalde FileGroup in te voegen
  • We kunnen het niet gebruiken om gegevens in een bestaande tabel in te voegen

De instructie INSERT INTO SELECT

We willen records invoegen als een normale database-activiteit. We kunnen gegevens rechtstreeks invoegen met behulp van clienttools zoals SSMS, Azure Data Studio of rechtstreeks vanuit een applicatie. In SQL gebruiken we de SQL INSERT INTO-instructie om records in te voegen.

De syntaxis van de INSERT INTO

Zodra we gegevens in de tabel invoegen, kunnen we de volgende syntaxis gebruiken voor onze SQL INSERT INTO-instructie.

1
2

VOEG IN tabelnaam (Kolom1, Kolom 2 ….)
WAARDEN (waarde1, waarde2, …);

Als we alle kolomwaarden hebben gespecificeerd volgens tabelkolom bestellingen, hoeven we geen kolomnamen op te geven. We kunnen records rechtstreeks in de tabel invoegen.

1
2

INVOEGEN IN tabelnaam
WAARDEN (waarde1, waarde2, …);

Laten we een voorbeeldtabel maken en er gegevens in invoegen .

1
2
3
4

MAAK TABEL Werknemers
(ID INT,
Naam VARCHAR (20)
);

We kunnen gegevens invoegen met behulp van de volgende zoekopdrachten. Beide zoekopdrachten zijn geldig voor het invoegen van gegevens.

1
2

Invoegen in Werknemers (ID, Naam) waarden (1, “raj”)
Invoegen in Werknemerswaarden (2, “raj”)

We kunnen geen gegevens invoegen zonder kolomnamen op te geven als er een mismatch tussen het invoegen van gegevens en de volgorde van kolomwaarden is anders. We kunnen het volgende foutbericht krijgen.

  • Msg 213, Level 16, State 1, Line 6

    Kolomnaam of aantal opgegeven waarden niet match tabeldefinitie.

  • Msg 245, Level 16, State 1, Line 6

    Conversie mislukt bij het converteren van de varchar-waarde raj naar datatype int.

In dit voorbeeld gebruiken we de instructie SQL INSERT INTO om waarden rechtstreeks in een instructie op te geven. Stel dat we gegevens uit een andere tabel willen invoegen. We kunnen de SQL INSERT INTO-instructie nog steeds gebruiken met een select-instructie. Laten we dit in de volgende sectie onderzoeken.

INSERT INTO SELECT Statement Syntax

We kunnen gegevens van andere SQL-tabellen in een tabel invoegen met de volgende INSERT INTO SELECT-instructie.

1
2
3

VOEG IN table1 (col1, col2, col3, …)
SELECTEER col1, col2, col3, …
FROM table2

Deze query voert de volgende taken uit:

  • Het selecteert eerst records uit een tabel (Select statement)
  • Vervolgens wordt het ingevoegd in een tabel gespecificeerd met INSERT INTO
  • Opmerking: de kolomstructuur moet overeenkomen tussen de kolom die wordt geretourneerd door de SELECT-instructie en de doeltabel.

INSERT IN SELECT voorbeelden

Voorbeeld 1: voeg gegevens in van alle kolommen van de brontabel naar de doeltabel

We hebben de volgende records in een bestaande Werknemerstabel.

Laten we een andere tabel Klanten maken met de volgende vraag.

1
2
3
4

CREËER TABEL klanten
(ID INT,
Naam VARCHAR (20)
);

We willen alle records van de tabel Werknemers invoegen in de klantentafel. We kunnen de SQL INSERT INTO SELECT-instructie gebruiken om dit te doen.

1
2
3

INVOEGEN IN klanten
SELECTEER *
VAN werknemers;

Het voegt alle records in de tabel Klanten in. We kunnen controleren of de records in de tabel Klanten vergelijkbaar zijn met de tabel Werknemers.

In dit voorbeeld hebben we records ingevoegd voor alle kolommen naar de tabel Klanten.

Voorbeeld 2: Voeg rijen in van de bron- naar de doeltabel door kolomnamen op te geven

Laten we de bestaande tabel Klanten verwijderen voordat we verder gaan. Nu willen we een tabel maken met een extra IDENTITY-kolom. IDENTITY-kolom voegt automatisch identiteitswaarden in een tabel in. We hebben ook een stadskolom toegevoegd die NULL-waarden toestaat

1
2
3
4
5
6

CREËER TABEL Klanten
(ID INT IDENTITY (1, 1),
Emp_ID INT,
Naam VARCHAR (20),
Plaats VARCHAR (20) NULL,
);

We kunnen de INSERT INTO SELECT-instructie niet gebruiken die lijkt op de boven voorbeeld. Als we deze code proberen uit te voeren, krijgen we een foutmelding.

1
2
3

INVOEGEN IN klanten
SELECTEER *
VAN werknemers ;

In dit geval moeten we de kolomnaam specificeren met INSERT INTO-instructie.

1
2
3

INVOEGEN IN klanten (Emp_ID, naam)
SELECTEER *
VAN werknemers;

In de tabel Klanten hebben we een extra kolom met staat NULL-waarden toe. Laten we een selectietabel voor klanten uitvoeren. In de volgende schermafbeelding zien we NULL-waarden in de kolom Stad.

Stel dat u een andere kolom in de brontabel heeft. U kunt nog steeds records in de bestemmingstabel invoegen door kolomnamen op te geven in de instructie INSERT INTO SELECT. We moeten een geschikt gegevenstype hebben om gegevens in te voegen. U kunt geen varchar-kolomgegevens invoegen in een INT-kolom.

Voeg een nieuwe kolom toe aan de tabel Werknemers met de instructie ALTER TABLE.

1
2

WIJZIG TABEL Werknemers
VOEG Land toe varchar (50);

Werk de tabelrecords bij met de landwaarde India.

1

Werknemersreeks bijwerken Country = “India”

Voer nu de INSERT INTO SELECT-instructie. U kunt zien dat we SELECT * gebruiken in plaats van kolomnamen op te geven.

1
2
3

INVOEGEN IN klanten (Emp_ID, naam)
SELECT *
FROM Werknemers;

We krijgen de volgende foutmelding. Deze fout wordt veroorzaakt doordat de kolommen niet overeenkomen tussen de brontabel en de doeltabel.

We kunnen de kolom tussen de bron- en bestemmingstabel toewijzen met behulp van de volgende zoekopdracht.

1
2
3
4
5
6

INVOEGEN IN klanten
(Emp_ID,
Naam
)
SELECTEER ID, naam
VAN werknemers;

Voorbeeld 3: bovenste rijen invoegen met INSERT INTO SELECT statement

Stel dat we de bovenste N rijen van de brontabel naar de doeltabel willen invoegen. We kunnen de Top-clausule gebruiken in de INSERT INTO SELECT-instructie. In de volgende zoekopdracht wordt de eerste rij van de tabel Werknemers ingevoegd in de tabel Klanten.

1
2
3
4
5
6

VOEG TOP (1) IN AAN klanten
(Emp_ID,
Naam
)
SELECTEER ID, naam
FROM werknemers;

Voorbeeld 4: invoegen met gebruik van beide kolommen en gedefinieerde waarden in de SQL INSERT INTO SELECT-instructie

In eerdere voorbeelden hebben we ofwel specifieke waarden gespecificeerd in de INSERT INTO-instructie of INSERT INTO SELECT gebruikt om records uit de brontabel op te halen en in de doeltabel in te voegen.

We kunnen zowel kolommen als gedefinieerde waarden combineren in de SQL INSERT INTO SELECT-instructie.

We hebben de volgende kolommen in de tabel Klanten en medewerkers. Eerder hebben we geen waarden ingevoerd voor de kolom Stad. We hebben ook niet de vereiste waarden in de tabel Werknemer. We moeten een expliciete waarde opgeven voor de kolom Stad.

In de volgende zoekopdracht hebben we een waarde opgegeven voor de stad terwijl de rest van de waarden die we hebben ingevoegd uit de tabel Werknemers.

1
2

VOEG TOP (1) IN AAN klanten (Emp_ID, naam, stad)
SELECTEER ID, naam, “Delhi” VAN Medewerkers;

In de volgende zoekopdracht kunnen we zien dat er een wordt ingevoegd rij (vanwege de Top (1) -clausule) samen met de waarde voor de kolom Stad.

Voorbeeld 5: INSERT INTO SELECT statement met Join-clausule om gegevens uit meerdere tabellen op te halen

We kunnen een JOIN-clausule gebruiken om gegevens uit meerdere tabellen te halen. Deze tabellen zijn samengevoegd met voorwaarden die zijn gespecificeerd met de ON-clausule. Stel dat we gegevens uit meerdere tabellen willen halen en in een tabel willen invoegen.

In dit voorbeeld gebruik ik de AdventureWorks2017-database. Maak eerst een nieuwe tabel met de juiste gegevenstypen.

Deze tabel moet records bevatten van de uitvoer van een samenvoegquery met meerdere tabellen. Voer de volgende zoekopdracht uit om gegevens in de HumanResources.EmployeeData-tabel in te voegen.

Voorbeeld 6: INSERT INTO SELECT-instructie met gemeenschappelijke tabelexpressie

We gebruiken Common Table Expressions (CTE) om complexe samenvoegingen vanuit meerdere kolommen te vereenvoudigen. In het vorige voorbeeld hebben we JOINS gebruikt in een Select-instructie voor het invoegen van gegevens in een SQL-tabel. In dit deel zullen we de query herschrijven met CTE.

In een CTE kunnen we code in twee delen verdelen.

  1. We definiëren CTE met een WITH-clausule vóór SELECT, INSERT, UPDATE, DELETE-instructie
  2. Zodra we CTE hebben gedefinieerd, kunnen we verwijzen naar de CTE, vergelijkbaar met een relationele SQL-tabel.

Voer de volgende code uit om gegevens in te voegen met een CTE.

Voorbeeld 7 : INSERT INTO SELECT-instructie met een tabelvariabele

We gebruiken tabelvariabelen op dezelfde manier als een tijdelijke tabel. We kunnen ze declareren met behulp van het tabelgegevenstype. Deze tabel kan worden gebruikt om activiteiten uit te voeren in SQL Server waar we geen permanente tabel nodig hebben. U kunt de volgende query in drie delen verdelen.

  1. Maak een SQL-tabelvariabele met de juiste kolomgegevenstypen. We moeten het gegevenstype TABLE gebruiken voor de tabelvariabele
  2. Voer een INSERT INTO SELECT-instructie uit om gegevens in een tabelvariabele in te voegen
  3. Bekijk de resultatenset van de tabelvariabele

Conclusie

In dit artikel onderzoeken we de use cases van de INSERT INTO SELECT-instructie. Ik hoop dat je dit artikel nuttig vond. Voel je vrij om feedback te geven in de reacties hieronder.

  • Auteur
  • Recente berichten
Als MCSA-gecertificeerd en Microsoft Certified Trainer in Gurgaon, India, met 13 jaar ervaring, Rajendra werkt voor verschillende grote bedrijven die zich richten op prestatieoptimalisatie, monitoring, hoge beschikbaarheid en strategieën en implementatie bij noodherstel. Hij is de auteur van honderden gezaghebbende artikelen over SQL Server, Azure, MySQL, Linux, Power BI, Performance tuning, AWS / Amazon RDS, Git en aanverwante technologieën die tot nu toe door meer dan 10 miljoen lezers zijn bekeken.
Hij is de maker van een van de grootste gratis online verzamelingen artikelen over één onderwerp, met zijn 50-delige serie over SQL Server Always On Availability Groups. Op basis van zijn bijdrage aan de SQL Server-gemeenschap, is hij bekroond met verschillende prijzen, waaronder de prestigieuze “Beste auteur van het jaar”, continu in 2020 en 2021 bij SQLShack.
Raj is altijd geïnteresseerd in nieuwe uitdagingen, dus als je advies nodig hebt hulp bij elk onderwerp dat in zijn geschriften aan bod komt, hij is te bereiken op [email protected]
Bekijk alle berichten van Rajendra Gupta

Laatste berichten door Rajendra Gupta (bekijk alle)
  • Kleine en grote versie-upgrades uitvoeren voor AWS RDS SQL Server – 29 januari 2021
  • Implementatie van AWS RDS PostgreSQL-instances – 27 januari 2021
  • Migratie van uw lokale SQL-databases naar AWS RDS SQL Server met behulp van AWS DMS – 25 januari , 2021

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *