SQLShack (Italiano)
Questo articolo tratterà listruzione SQL SELECT INTO inclusa la sintassi, parametri e utilizzo con più tabelle, filegroup e una condizione WHERE
Inseriamo regolarmente dati nelle tabelle di SQL Server da unapplicazione o direttamente in SSMS. Possiamo inserire dati usando listruzione INSERT INTO. Per fare ciò, dovremmo avere una tabella già in posizione per inserire i dati al suo interno poiché non possiamo creare una tabella utilizzando Insert nellistruzione.
Dobbiamo eseguire le seguenti attività utilizzando listruzione INSERT INTO.
- Crea una struttura di tabella con i tipi di dati appropriati
- Inserisci dati al suo interno
Ma la buona notizia è che possiamo svolgere entrambe le attività insieme, elegantemente, utilizzando listruzione SQL SELECT INTO. Crea una struttura di tabella per le colonne restituite dallistruzione Select.
Supponiamo di voler aggiornare molti record in una tabella. Possiamo utilizzare listruzione SELECT INTO per creare una tabella di backup con la struttura esistente a partire dalla tabella di origine. Esploriamo la SELECT INTO in questo articolo.
Sintassi dellistruzione SELECT INTO
1
2
3
4
|
SELEZIONA colonna1, colonna2 .. .ColumnN
NELLA Nuova_tabella
DALLE tabelle
;
|
Parametri nellistruzione SELECT INTO
- Elenco colonne: dobbiamo specificare la colonna che vogliamo recuperare e inserire in una nuova tabella
- New_table: possiamo specificare il nuovo nome della tabella qui. SQL Server crea una nuova tabella con le colonne menzionate nellelenco delle colonne. Non possiamo sostituire una tabella esistente usando questo. Il nome della tabella deve essere univoco
- Tabelle: contiene una tabella da cui vogliamo ottenere i record. Possiamo avere più tabelle definite anche qui con la clausola Join appropriata
- WHERE condizioni: possiamo filtrare i record utilizzando la clausola Where. È una clausola facoltativa
Esploriamo listruzione SQL SELECT INTO utilizzando esempi.
Ambiente:
In questo esempio, stiamo usando database di esempio AdventureWorks2017. Supponiamo di voler selezionare i record dalla tabella e di creare una nuova tabella utilizzando listruzione SELECT INTO. Vogliamo solo le colonne selezionate nella nuova tabella. Eseguiamo unistruzione select sulla tabella Employee con le colonne che vogliamo avere.
Prima di eseguire SQL SELECT INTO dichiarazione, possiamo verificare che la tabella Employee_Demo non esiste nel database AdventureWorks2017 utilizzando il comando sp_help.
1
|
sp_help “..”
|
Nello screenshot seguente, possiamo vedere che la tabella Employee_Demo non esiste nel mio database.
Eseguire la seguente query per creare una nuova tabella utilizzando listruzione SELECT INTO.
Otteniamo il seguente messaggio di output in Azure Data Studio. Puoi notare che il numero di righe interessate è 10. Nella query, abbiamo selezionato i primi 10 record da una tabella Employee.
Possiamo accedere ai dati dalla tabella Employee_Demo appena creata e verificare che contenga gli stessi record della nostra precedente istruzione select.
Non abbiamo specificato alcuna proprietà di colonna nellistruzione SQL SELECT INTO. Confrontiamo le colonne della tabella di origine e di destinazione e le loro proprietà.
Possiamo eseguire il comando sp_help “tablename” sia sulla tabella Employee che sulla tabella Employee_Demo. Ho copiato loutput di entrambe le tabelle in Excel (per le colonne selezionate). Nello screenshot seguente, puoi vedere che il tipo di dati della colonna e le loro proprietà sono simili.
Nella precedente istruzione SQL SELECT INTO , abbiamo preparato una tabella di destinazione (Employee_Demo) da alcune colonne nella tabella di origine (Employee).
Creiamo unaltra tabella con tutte le colonne in una tabella Employee con la seguente query.
Nelloutput, possiamo vedere che ha inserito 290 righe nella tabella Employee_All.
Abbiamo verificato che SELECT INTO Listruzione crea una nuova tabella con le colonne specificate nellelenco delle colonne. Crea un tipo di dati simile anche nella tabella di destinazione.
Supponiamo di avere chiavi primarie ed esterne nella tabella di origine. Crea una chiave primaria e una chiave esterna simili alla tabella di origine? No, listruzione SQL SELECT INTO non crea alcuna chiave nella tabella di destinazione. Se vogliamo, possiamo definire le chiavi nella tabella di destinazione. Verifichiamo questo nella sezione seguente.
Nel mio esempio precedente, la tabella Employee contiene la chiave primaria ed esterna definita su di essa. Possiamo ottenere un elenco di chiavi esistenti utilizzando la vista INFORMATION_SCHEMA. Esegui il codice seguente e restituisce le chiavi primarie ed esterne esistenti nella tabella Employee.
Possiamo vedere, la tabella Employee contiene chiavi primarie ed esterne.
Abbiamo copiato tutte le colonne in Employee_All dalla tabella Employee. Dobbiamo controllare la chiave primaria ed esterna sulla tabella di destinazione ora.
Possiamo vedere che non contiene alcuna chiave nella tabella di destinazione. Ci dà la flessibilità di definire le chiavi nella tabella di destinazione.
SQL SELECT INTO – Inserisci dati da più tabelle
Negli esempi precedenti, abbiamo creato una tabella utilizzando listruzione SELECT INTO da una singola tabella Employee. Possiamo anche unire più tabelle e utilizzare listruzione SELECT INTO per creare anche una nuova tabella con i dati. In questa sezione, vogliamo unire più tabelle insieme. Nella seguente query, abbiamo unito le seguenti tabelle in AdventureWorks2017.
Esegui la seguente query. Fornisce risultati da più tabelle in base alla condizione di join e alle colonne menzionate.
Esegui una query e otteniamo dopo loutput dellistruzione SQL SELECT INTO.
Vogliamo creare una tabella con i dati restituiti utilizzando la tabella sopra. Eseguiamo listruzione SQL SELECT INTO.
Crea. tabella e inserire i dati in essa. Possiamo verificare i record in questa tabella mediante listruzione select.
Possiamo vedere che puoi unire più tabelle insieme e creare output tabella utilizzando listruzione SELECT INTO.
Non è necessario occuparsi della definizione dei tipi di dati per la tabella di destinazione. Se vogliamo creare una tabella manualmente, dobbiamo esaminare il tipo di dati di ciascuna colonna e definire il tipo di dati di conseguenza. In caso di mancata corrispondenza tra i tipi di dati, è possibile visualizzare un messaggio di errore simile al seguente.
Errore 1: a causa di una mancata corrispondenza nei tipi di dati
Msg 245, livello 16, stato 1 , Riga 1
Conversione non riuscita durante la conversione del valore varchar “GG” nel tipo di dati int.
Errore 2: messaggio 8152, livello 16, stato 30, riga 2
Stringa oppure i dati binari verrebbero troncati.
Non otteniamo questi errori durante linserimento dei dati utilizzando listruzione SQL SELECT INTO. Tuttavia, non possiamo inserire dati in tabelle esistenti usando questo metodo.
SELEZIONA INTO – Specifica filegroup
Nelle sezioni precedenti, abbiamo esplorato la possibilità di creare una nuova tabella e inserire dati in essa utilizzando listruzione SQL SELECT INTO dalle tabelle esistenti. Crea una tabella solo nel Filegroup predefinito. Non è possibile specificare un particolare filegroup fino a SQL Server 2016. In SQL Server 2017, è possibile specificare un particolare filegroup in cui creare una nuova tabella. SQL Server crea una nuova tabella in quel particolare Filegroup della tabella di verifica. Se non si specifica alcun filegroup in SQL Server 2017 e versioni successive, viene creata una tabella nel filegroup predefinito.
Nota: non è possibile specificare filegroup in SQL SELECT INTO per SQL Server 2016 e versioni precedenti.
Aggiungiamo un nuovo filegroup nel database AdventureWorks2017. Fai clic con il pulsante destro del mouse sul database e vai a Filegroup.
In questa pagina Filegroup, fai clic su Aggiungi FileGroup e specifica un nome per Filegroup.
Ora, fai clic su File ed elenca i file di database esistenti (file di dati e log), in questa pagina, aggiungi un nuovo file di dati e specifica FileGroup dallelenco a discesa. Dovrebbe essere FileGroup che abbiamo creato proprio ora.
Vogliamo creare una tabella SQL in INSERTFILE Filegroup. Non abbiamo impostato questo filegroup come filegroup predefinito.
Nella query seguente, puoi vedere che abbiamo specificato il nome del filegroup utilizzando la clausola ON. Funziona in modo simile a una normale istruzione SQL SELECT INTO con una differenza in un filegroup.
1
2
3
|
seleziona * in person.person_temp
ON INSERTFILE –FILEGROUP NOME
da person.person
|
Una volta creata la tabella, eseguire un comando sp_help su questa tabella appena creata. Nello screenshot seguente, possiamo verificare che la tabella si trovi in INSERTFILE FileGroup. È il FileGroup che abbiamo creato in precedenza.
Possiamo anche verificarlo dalle proprietà della tabella. Fare clic con il tasto destro su una tabella in SSMS. Nella sezione Archiviazione, possiamo vedere il FileGroup desiderato.
SELEZIONA INTO con una condizione Where
Supponiamo di voler creare una tabella con unistruzione SQL SELECT INTO con pochi record in essa. Possiamo usare una clausola Where simile a unistruzione select.Nella seguente query, vogliamo creare una tabella person.person_WC per la persona con cognome come% Duf%.
1
2
3
4
|
seleziona * in person.person_WC
ON INSERTFILE – Verifica tabella Filegroup
da person.person
dove Cognome come “% Duf%”
|
Conclusione
In questo articolo, abbiamo esplorato lSQL Istruzione SELECT INTO e scenari di utilizzo. È un comando utile per creare una copia di una tabella senza specificare i tipi di dati.
- Autore
- Post recenti
È lautore di una delle più grandi raccolte online gratuite di articoli su un singolo argomento, con la sua serie di 50 parti sui gruppi di disponibilità Always On di SQL Server. Sulla base del suo contributo alla comunità di SQL Server, è stato riconosciuto con vari premi tra cui il prestigioso “Miglior autore dellanno” ininterrottamente nel 2020 e 2021 a SQLShack.
Raj è sempre interessato a nuove sfide, quindi se hai bisogno di consulenza aiuto su qualsiasi argomento trattato nei suoi scritti, può essere raggiunto a [email protected]
Visualizza tutti i post di Rajendra Gupta
- Esecuzione di aggiornamenti delle versioni minori e principali per AWS RDS SQL Server – 29 gennaio 2021
- Distribuzione di istanze PostgreSQL di AWS RDS – 27 gennaio 2021
- Migrazione dei database SQL locali ad AWS RDS SQL Server utilizzando AWS DMS – 25 gennaio , 2021