SQLShack (Svenska)

Den här artikeln omfattar SQL INSERT INTO SELECT-satsen tillsammans med dess syntax, exempel och användningsfall.

I min tidigare artikel SQL SELECT INTO Statement undersökte vi följande uppgifter.

  • Skapa en SQL-tabell i farten medan du infogar poster med lämpliga datatyper
  • Använd SQL SELECT INTO för att infoga poster i en viss FileGroup
  • Vi kan inte använda den för att infoga data i en befintlig tabell

INSERT INTO SELECT-satsen

Vi vill infoga poster som en vanlig databasaktivitet. Vi kan infoga data direkt med klientverktyg som SSMS, Azure Data Studio eller direkt från en applikation. I SQL använder vi SQL INSERT INTO-satsen för att infoga poster.

Syntaxen för INSERT INTO

När vi har infogat data i tabellen kan vi använda följande syntax för vår SQL INSERT INTO-uttalande.

1
2

INSÄTT I tabellnamn (Kolumn1, Kolumn 2 ….)
VÄRDEN (värde1, värde2, …);

Om vi har angett alla kolumnvärden enligt tabellkolumnen order behöver vi inte ange kolumnnamn. Vi kan infoga poster direkt i tabellen.

1
2

INSÄTTA I tabellnamn
VÄRDEN (värde1, värde2, …);

Låt oss skapa en provtabell och infoga data i den .

1
2
3
4

SKAPA TABELL Anställda
(ID INT,
Namn VARCHAR (20)
);

Vi kan infoga data med följande frågor. Båda frågorna är giltiga för infogning av data.

1
2

Infoga i anställda (ID, namn) värden (1, ”raj”)
Infoga i anställda värden (2, ”raj”)

Vi kan inte infoga data utan att ange kolumnnamn om det finns en skillnaden mellan datainsättning och ordning på kolumnvärden är annorlunda. Vi kan få följande felmeddelande.

  • Msg 213, nivå 16, tillstånd 1, rad 6

    Kolumnnamn eller antal levererade värden inte matcha tabelldefinition.

  • Msg 245, Nivå 16, tillstånd 1, rad 6

    Konvertering misslyckades när omvandlingsvarvärdet raj till datatyp int.

I det här exemplet använder vi SQL INSERT INTO-satsen med att leverera värden direkt i ett uttalande. Antag att vi vill infoga data från en annan tabell. Vi kan fortfarande använda SQL INSERT INTO-satsen med ett valt uttalande. Låt oss utforska detta i nästa avsnitt.

INSERT INTO SELECT Statement Syntax

Vi kan infoga data från andra SQL-tabeller i en tabell med följande INSERT INTO SELECT-uttalande.

1
2
3

INSÄTTA I tabell1 (col1, col2, col3,…)
VÄLJ col1, col2, col3,…
FRÅN table2

Denna fråga utför följande uppgifter:

  • Det väljer först poster från en tabell (Välj uttalande)
  • Därefter infogas det i en tabell som anges med INSERT INTO

  • Obs! Kolumnstrukturen ska matcha mellan den kolumn som returneras av SELECT-satsen och måltabellen.

INSERT INTO SELECT-exempel

Exempel 1: infoga data från alla kolumner i källtabellen till måltabellen

Vi har följande poster i en befintlig anställdstabell.

Låt oss skapa en annan tabellkunder med följande fråga.

1
2
3
4

SKAPA TABELL Kunder
(ID INT,
Namn VARCHAR (20)
);

Vi vill infoga alla poster från tabellen Anställda till tabellen Kunder. Vi kan använda SQL INSERT INTO SELECT-satsen för att göra detta.

1
2
3

INSÄTT I KUNDER
VÄLJ *
FRÅN anställda;

Den infogar alla poster i tabellen Kunder. Vi kan verifiera att posterna i kundtabellen liknar tabellen Anställda.

I det här exemplet infogade vi poster för alla kolumner till kundtabellen.

Exempel 2: Infoga rader från källa till måltabell genom att ange kolumnnamn

Låt oss släppa den befintliga kundtabellen innan vi går vidare. Nu vill vi skapa en tabell med ytterligare en IDENTITY-kolumn. IDENTITY-kolumnen infogar automatiskt identitetsvärden i en tabell. Vi har också lagt till en stadskolumn som tillåter NULL-värden

1
2
3
4
5
6

CREATE TABELL Kunder
(ID INT IDENTITET (1, 1),
Emp_ID INT,
Namn VARCHAR (20),
Stad VARCHAR (20) NULL,
);

Vi kan inte använda uttalandet INSERT INTO SELECT som liknar ovanstående exempel. Om vi försöker köra den här koden får vi ett felmeddelande.

1
2
3

INSÄTTA I KUNDER
VÄLJ *
FRÅN anställda ;

I det här fallet måste vi ange kolumnnamnet med INSERT INTO-uttalande.

1
2
3

INSÄTT I KUNDER (Emp_ID, namn)
VÄLJ *
FRÅN anställda;

I tabellen Kunder har vi en ytterligare kolumn med tillåter NULL-värden. Låt oss köra en tabell Välj på kunder. I följande skärmdump kan vi se NULL-värden i kolumnen Stad.

Antag att du har en annan kolumn i källtabellen. Du kan fortfarande infoga poster i måltabellen med angivande av kolumnnamn i INSERT INTO SELECT-satsen. Vi borde ha en lämplig datatyp för att infoga data. Du kan inte infoga en varchar-kolumndata i en INT-kolumn.

Lägg till en ny kolumn i tabellen Anställda med ALTER TABLE-satsen.

1
2

ALTER TABLE Anställda
LÄGG TILL Land varchar (50);

Uppdatera tabellposterna med landets värde Indien.

1

Uppdatera anställda Land = ”Indien”

Kör om INSERT INTO VÄLJ uttalande. Du märker att vi använder SELECT * istället för att ange kolumnnamn.

1
2
3

INSÄTT I KUNDER (Emp_ID, namn)
VÄLJ *
FRÅN anställda;

Vi får följande felmeddelande. Det här felet beror på att kolumnen inte matchar källtabellen och måltabellen.

Vi kan mappa kolumnen mellan käll- och måltabellen med hjälp av följande fråga.

1
2
3
4
5
6

INSÄTT I KUNDER
(Emp_ID,
Namn
)
VÄLJ ID, namn
FRÅN anställda;

Exempel 3: Infoga övre rader med INSERT INTO SELECT uttalande

Antag att vi vill infoga Top N-rader från källtabellen till måltabellen. Vi kan använda Top-satsen i INSERT INTO SELECT-uttalandet. I följande fråga infogas den översta raden från tabellen Anställda till tabellen Kunder.

1
2
3
4
5
6

INSÄTT TOPP (1) I KUNDER
(Emp_ID,
Namn
)
VÄLJ ID, namn
FRÅN anställda;

Exempel 4: Infoga med båda kolumnerna och definierade värden i SQL INSERT INTO SELECT-uttalande

I tidigare exempel specificerade vi antingen specifika värden i INSERT INTO-uttalandet eller använde INSERT INTO SELECT för att hämta poster från källtabellen och infoga dem i destinationstabellen. >

Vi kan kombinera både kolumner och definierade värden i SQL-INSERT INTO SELECT-satsen.

Vi har följande kolumner i tabellen Kunder och anställda. Tidigare har vi inte lagt in några värden för kolumnen Stad. Vi har inte heller de nödvändiga värdena i tabellen Anställda. Vi måste ange ett uttryckligt värde för stadskolumnen.

I följande fråga angav vi ett värde för staden medan resten av värdena vi infogade från tabellen Anställda.

1
2

INSÄTT TOPP (1) I KUNDER (Emp_ID, namn, stad)
VÄLJ ID, namn, ”Delhi” FRÅN anställda;

I följande fråga kan vi se att den infogar en rad (på grund av Top (1) -satsen) tillsammans med värde för stadskolumnen.

Exempel 5: INSERT IN TO SELECT uttalande med Join-sats för att få data från flera tabeller

Vi kan använda en JOIN-sats för att få data från flera tabeller. Dessa tabeller är förenade med villkor som anges med ON-klausulen. Antag att vi vill hämta data från flera tabeller och infoga i en tabell.

I det här exemplet använder jag AdventureWorks2017-databasen. Skapa först en ny tabell med lämpliga datatyper.

Den här tabellen ska innehålla poster från utdata från en fråga om flera tabeller. Utför följande fråga för att infoga data i HumanResources.EmployeeData-tabellen.

Exempel 6: INSERT INTO SELECT-sats med gemensamt tabelluttryck

Vi använder Common Table Expressions (CTE) för att förenkla komplex sammanfogning från flera kolumner. I föregående exempel använde vi JOINS i ett Select-uttalande för att infoga data i en SQL-tabell. I den här delen kommer vi att skriva om frågan med CTE.

I en CTE kan vi dela upp koden i två delar.

  1. Vi definierar CTE med en WITH-sats före SELECT, INSERT, UPDATE, DELETE-sats
  2. När vi har definierat CTE kan vi referera till CTE som liknar en relationell SQL-tabell

Kör följande kod för att infoga data med hjälp av en CTE.

Exempel 7 : INSERT INTO SELECT-sats med en tabellvariabel

Vi använder tabellvariabler på samma sätt som en tillfällig tabell. Vi kan deklarera dem med hjälp av tabelldatatypen. Denna tabell kan användas för att utföra aktiviteter i SQL Server där vi inte behöver en permanent tabell. Du kan dela upp följande fråga i tre delar.

  1. Skapa en SQL-tabellvariabel med lämpliga kolumndatatyper. Vi måste använda datatyp TABELL för tabellvariabel
  2. Kör ett INSERT INTO SELECT-uttalande för att infoga data i en tabellvariabel
  3. Visa tabellvariabelns resultatuppsättning

Slutsats

I den här artikeln undersöker vi användningsfallet för INSERT INTO SELECT-satsen. Jag hoppas att du tyckte att den här artikeln var till hjälp. Lämna gärna feedback i kommentarerna nedan.

  • Författare
  • Senaste inlägg
Som MCSA-certifierad och Microsoft Certified Trainer i Gurgaon, Indien, med 13 års erfarenhet, arbetar Rajendra för en mängd stora företag med fokus på prestandaoptimering, övervakning, hög tillgänglighet och katastrofåterställningsstrategier och implementering. Han är författare till hundratals auktoritativa artiklar om SQL Server, Azure, MySQL, Linux, Power BI, Performance Tuning, AWS / Amazon RDS, Git och relaterade teknologier som hittills har visats av över 10 miljoner läsare.
Han är skaparen av en av de största gratis onlinesamlingarna av artiklar om ett enda ämne, med sin 50-delarserie om SQL Server Always On Availability Groups. Baserat på sitt bidrag till SQL Server-communityn har han fått utmärkelser med olika utmärkelser inklusive den prestigefyllda ”Årets bästa författare” kontinuerligt 2020 och 2021 på SQLShack.
Raj är alltid intresserad av nya utmaningar så om du behöver rådgivning hjälp om alla ämnen som behandlas i hans skrifter, han kan nås på [email protected]
Visa alla inlägg av Rajendra Gupta

Senaste inlägg av Rajendra Gupta (se alla)
  • Utför mindre och större versionuppgraderingar för AWS RDS SQL Server – 29 januari 2021
  • Distribuera AWS RDS PostgreSQL-instanser – 27 januari 2021
  • Migrera dina lokala SQL-databaser till AWS RDS SQL Server med AWS DMS – 25 januari 2021

Lämna ett svar

Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *