SQLShack (Dansk)
Denne artikel dækker SQL SELECT INTO-sætningen inklusive syntaks, parametre og brug med flere tabeller, filgrupper og en WHERE-tilstand
Vi indsætter regelmæssigt data i SQL Server-tabeller enten fra et program eller direkte i SSMS. Vi kan indsætte data ved hjælp af INSERT INTO-sætningen. For at gøre dette skal vi allerede have en tabel til at indsætte data i den, da vi ikke kan oprette en tabel ved hjælp af Indsæt i udsagnet.
Vi skal udføre følgende opgaver ved hjælp af INSERT INTO-sætningen.
- Opret en tabelstruktur med passende datatyper
- Indsæt data i den
Men den gode nyhed er, at vi kan udføre begge opgaver sammen, elegant ved hjælp af SQL SELECT INTO-sætningen. Det opretter en tabelstruktur for de kolonner, der returneres af Select-sætningen.
Antag, at vi vil opdatere mange poster i en tabel. Vi kan bruge SELECT INTO-sætningen til at oprette en backup-tabel med den eksisterende struktur fra kildetabellen. Lad os udforske SELECT INTO i denne artikel.
SELECT INTO statement syntax
1
2
3
4
|
VÆLG kolonne1, kolonne2 .. .ColumnN
INTO New_table
FRA tabeller
;
|
Parametre i SELECT INTO-erklæringen
- Kolonneliste: Vi skal specificere kolonne, vi vil hente og indsætte i en ny tabel
- Ny_tabel: Vi kan angive det nye tabelnavn her. SQL Server opretter en ny tabel med kolonner nævnt i kolonnelisten. Vi kan ikke erstatte en eksisterende tabel ved hjælp af denne. Tabelnavn skal være entydigt
- Tabeller: Det indeholder en tabel, hvorfra vi vil hente poster. Vi kan også have defineret flere tabeller her med den rette Join-klausul
- WHERE betingelser: Vi kan filtrere poster ved hjælp af Where-klausul. Det er en valgfri klausul
Lad os udforske SQL SELECT INTO-sætningen ved hjælp af eksempler.
Miljø:
I dette eksempel bruger vi eksempeldatabase AdventureWorks2017. Antag, at vi vil vælge poster fra tabellen og oprette en ny tabel ved hjælp af SELECT INTO-sætningen. Vi ønsker kun valgte kolonner i den nye tabel. Lad os køre en udvælgelseserklæring på medarbejdertabellen med de kolonner, vi vil have.
Før vi udfører SQL SELECT INTO erklæring, kan vi kontrollere, at Employee_Demo-tabellen ikke findes i AdventureWorks2017-databasen ved hjælp af sp_help-kommandoen.
1
|
sp_help “..”
|
I det følgende skærmbillede kan vi se, at Employee_Demo-tabellen ikke findes i min database.
Udfør følgende forespørgsel for at oprette en ny tabel ved hjælp af SELECT INTO-sætningen.
Vi får følgende outputmeddelelse i Azure Data Studio. Du kan bemærke, at antallet af berørte rækker er 10. I forespørgslen valgte vi top 10 poster fra en medarbejdertabel.
Vi kan få adgang til data fra den nyoprettede tabel Employee_Demo og kontrollere, at den indeholder de samme poster som i vores tidligere select-sætning.
Vi specificerede ingen kolonneegenskaber i SQL SELECT INTO-sætningen. Lad os sammenligne kilde- og destinationstabelkolonnerne og deres egenskaber.
Vi kan køre sp_help tablenavn -kommandoen på både medarbejder- og medarbejderdemotabellen. Jeg kopierede output fra begge tabeller i excel (for udvalgte kolonner). I det følgende skærmbillede kan du se, at kolonnens datatype og deres egenskaber er ens.
I den forrige SQL SELECT INTO-sætning , forberedte vi en destinationstabel (Employee_Demo) fra et par kolonner i kildetabellen (Medarbejder).
Lad os oprette en anden tabel med alle kolonner i en medarbejdertabel med følgende forespørgsel.
I output kan vi se, at den er indsat 290 rækker i tabellen Employee_All.
Vi har verificeret, at SELECT INTO erklæring opretter en ny tabel med kolonner angivet i kolonnelisten. Det opretter også en lignende datatype i destinationstabellen.
Antag, at vi har primære og udenlandske nøgler i kildetabellen. Skaber det en primær nøgle og en fremmed nøgle, der også ligner kildetabellen? Nej, SQL SELECT INTO-sætningen opretter ikke nogen nøgler i destinationstabellen. Hvis vi vil, kan vi definere taster på destinationsbordet. Lad os kontrollere dette i det følgende afsnit.
I mit tidligere eksempel indeholder medarbejdertabellen den primære og udenlandske nøgle, der er defineret på den. Vi kan få en liste over eksisterende nøgler ved hjælp af INFORMATION_SCHEMA-visningen. Udfør følgende kode, og den returnerer eksisterende primære og udenlandske nøgler i medarbejdertabellen.
Vi kan se, medarbejdertabellen indeholder primære og udenlandske nøgler.
Vi kopierede alle kolonner i Employee_All fra medarbejdertabellen. Vi er nødt til at kontrollere primær- og fremmednøglen i destinationstabellen nu.
Vi kan se, at den ikke indeholder nogen nøgler i destinationstabellen. Det giver os fleksibilitet til at definere nøgler i destinationsbordet.
SQL SELECT INTO – Indsæt data fra flere tabeller
I tidligere eksempler oprettede vi en tabel ved hjælp af SELECT INTO-erklæringen fra en enkelt medarbejder. Vi kan også deltage i flere tabeller og bruge SELECT INTO-sætningen til også at oprette en ny tabel med data. I dette afsnit vil vi sammenføje flere tabeller. I den følgende forespørgsel sluttede vi os til følgende tabeller i AdventureWorks2017.
Udfør følgende forespørgsel. Det giver resultater fra flere tabeller baseret på sammenkædningsbetingelse og nævnte kolonner.
Udfør en forespørgsel, og vi følger output fra SQL SELECT INTO-sætningen.
Vi vil oprette en tabel med data, der returneres ved hjælp af ovenstående tabel. Lad os udføre SQL SELECT INTO-sætningen.
Den opretter. og indsæt data i den. Vi kan verificere poster i denne tabel ved hjælp af sætningen.
Vi kan se, at du kan sammenføje flere tabeller og skabe output tabel ved hjælp af SELECT INTO-sætningen.
Vi behøver ikke tage sig af at definere datatyper til destinationstabellen. Hvis vi vil oprette en tabel manuelt, skal vi se på datatypen for hver kolonne og definere datatype i overensstemmelse hermed. Hvis der er en uoverensstemmelse mellem datatyper, kan du få en fejlmeddelelse som følgende.
Fejl 1: På grund af en uoverensstemmelse i datatyper
Msg 245, niveau 16, tilstand 1 , Linje 1 – Konvertering mislykkedes ved konvertering af varchar-værdien GG til datatype int.
Fejl 2: Msg 8152, niveau 16, tilstand 30, linje 2
streng eller binære data ville blive afkortet.
Vi får ikke disse fejl, når vi indsætter data ved hjælp af SQL SELECT INTO-sætningen. Vi kan dog ikke indsætte data i eksisterende tabeller ved hjælp af denne metode.
SELECT INTO – Specify Filegroup
I tidligere sektioner undersøgte vi, at vi kan oprette en ny tabel og indsætte data i den ved hjælp af SQL SELECT INTO-sætningen fra eksisterende tabeller. Det opretter kun en tabel i standardfilgruppe. Vi kan ikke angive en bestemt filgruppe før SQL Server 2016. I SQL Server 2017 kan vi specificere en bestemt filgruppe, hvori en ny tabel skal oprettes. SQL Server opretter en ny tabel i den bestemte Bekræft tabel Filgruppe. Hvis vi ikke angiver nogen filgrupper i SQL Server 2017 og derover, opretter den en tabel i standardfilgruppen.
Bemærk: Vi kan ikke specificere filgrupper i SQL SELECT INTO til SQL Server 2016 og før.
Lad os tilføje en ny filgruppe i AdventureWorks2017-databasen. Højreklik på databasen, og gå til Filegroups.
På denne Filegroup-side skal du klikke på Tilføj FileGroup og angive et navn til Filegroup.
Klik nu på filer, og det viser eksisterende databasefiler (data- og logfil) på denne side, tilføj en ny datafil, og angiv FileGroup fra rullelisten. Det skulle være FileGroup, vi oprettede lige nu.
Vi vil oprette en SQL-tabel i INSERTFILE Filegroup. Vi har ikke indstillet denne filgruppe som standardfilgruppe.
I den følgende forespørgsel kan du se, at vi har angivet filgruppens navn ved hjælp af ON-klausulen. Det fungerer på samme måde som en almindelig SQL SELECT INTO-sætning med forskel i en filgruppe.
1
2
3
|
vælg * til person. Person_temp
PÅ INSERTFIL –FILEGROUP NAVN
fra person. Person
|
Når tabellen er oprettet, skal du udføre en sp_help-kommando på denne nyoprettede tabel. I det følgende skærmbillede kan vi kontrollere, at tabellen er placeret i INSERTFILE FileGroup. Det er FileGroup, vi oprettede tidligere.
Vi kan også bekræfte dette ud fra tabelegenskaber. Højreklik på en tabel i SSMS. I lagringsafsnittet kan vi se den ønskede FileGroup.
VÆLG INTO med en Where-betingelse
Antag, at vi vil oprette en tabel med en SQL SELECT INTO-sætning med få poster i den. Vi kan bruge en Where-klausul svarende til en valgt sætning.I den følgende forespørgsel vil vi oprette en person. Person_WC-tabel for den person, der har efternavnet, er som% Duf%.
1
2
3
4
|
vælg * til person.person_WC
PÅ INSERTFIL – Bekræft tabel Filegruppe
fra person.person
hvor Efternavn som “% Duf%”
|
Konklusion
I denne artikel undersøgte vi SQL SELECT INTO-sætning og dens brugsscenarier. Det er en nyttig kommando at oprette en kopi af en tabel uden at specificere datatyper.
- 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