Home > Articoli > Generare lo script di INSERT dei dati di una tabella

Generare lo script di INSERT dei dati di una tabella

In realtà aziendali in cui vengono gestiti più ambienti dedicati al ciclo di vita di un database (ad es. Sviluppo, Qualità e Produzione) capita spesso di dover copiare i record da una tabella di produzione nella equivalente tabella di sviluppo, in modo da "debuggare" eventuali errori.

Ebbene, troppo spesso ho visto fare il CTRL+C dalla finestra di Edit della tabella di produzione e poi il CTRL+V nella finestra di Edit della tabella di sviluppo… E questo quando era possibile connettersi con lo stesso client SSMS (SQL Server Management Studio) alle due istanze di SQL Server (per la serie “L’Import/Export Wizard, questo sconosciuto”!). Quando le due istanze non erano raggiungibili dallo stesso client, si aggiungeva uno step intermedio al workflow sopra descritto, che consisteva nell’incollare le righe copiate su un foglio Excel (sempre col CTRL+C – CTRL+V ovviamente)… Vi lascio immaginare i problemi di formattazione, cosa veniva fuori quando i punti decimali dovevano trasformarsi in virgole a seconda della localizzazione di Office, oppure quando le date non venivano riconosciute!! 🙂

Nel SSMS esiste la possibilità di generare non solo lo script dei metadati delle tabelle (tasto destro sulla tabella e poi Script Table as…), ma anche lo script di INSERT dei dati (dump della tabella). Basta cliccare col destro sul nodo del database (nel nostro caso AdventureWorks) cui appartiene la tabella e cliccare la voce Tasks –> Generate Scripts…

Dopo aver bypassato la schermata di introduzione, si ha la possibilità di scegliere gli oggetti per i quali generare lo script. Nel nostro caso selezioneremo solo la tabella Production.Product:

Nella schermata successiva abbiamo la possibilità di selezionare la destinazione dello script (nel nostro caso New Query Window) e soprattuto cosa includere nello script (se solo dati, solo schema oppure entrambi), tramite l’opzione Types of data to script raggiungibile cliccando sul pulsante Advanced:

Cliccando Next alle successive schermate, si ottiene una nuova finestra nel SSMS in cui abbiamo il nostro script (nello screenshot indentato e “ritoccato” per comodità):

Possiamo a questo punto salvare il nostro script ed eseguirlo sull’ambiente di destinazione (oppure consegnarlo al DBA che dovrà occuparsene).

Qualcuno di voi potrà obiettare che spesso non è sempre necessario dover creare uno script di INSERT contenente tutte le righe della tabella, ma è sufficiente avere lo script di un particolare sottoinsieme di righe. Supponiamo nel nostro caso di dover estrarre tutti i prodotti che abbiano il ProductNumber con le iniziali C, D ed E.

Benissimo, a questo punto dobbiamo ricorrere ad un tool gratuito che si integra in SSMS e che agevola di molto il nostro lavoro. Il tool è SSMS Tools Pack.

Dopo averlo installato, notiamo che in SSMS compare una nuova voce nel menù principale, accanto a View, denominata SSMS Tools. Inoltre, cliccando col destro sugli oggetti dell’Object Explorer, la stessa voce appare anche nel menù contestuale.

In particolare, cliccando col destro sul nodo della tabella Production.Product e selezionando la voce SSMS Tools –> Generate Insert Statements…, ci viene mostrata una dialog che ci permette sia di indicare un numero fissato di righe da estrarre, sia di “rifinire” la query SELECT * FROM Production.Product tramite l’aggiunta di filtri (clausula WHERE), sia di estrarre le righe secondo un ordinamento prefissato (clausula ORDER BY). Nel nostro caso, vogliamo aggiungere solo una clausola WHERE:

A questo punto possiamo generare il nostro script:

Possiamo osservare che ci sono delle differenze sostanziali tra lo script generato da SSMS di default e quello generato dal tool. Quest’ultimo script presenta:

  1. l’istruzione SET NOCOUNT ON, per non includere nel resultset il messaggio che riporta il numero di righe elaborate dallo script
  2. l’istruzione SET XACT_ABORT ON, che spinge l’engine ad eseguire automaticamente il rollback delle transazioni nel caso in cui una istruzione T-SQL generi un errore
  3. un blocco BEGIN TRANSACTION … COMMIT, che assicura che tutte le righe vengano inserite nella tabella; in caso di errore, il rollback automatico annullerà gli eventuali inserimenti fatti fino allo scatenarsi dell’errore
  4. i valori di tipo datetime espressi in un formato leggibile e indipendente dalla localizzazione di SQL Server
  5. l’utilizzo della sintassi INSERT … SELECT, che fa parte dei metodi di bulk loading previsti da SQL Server. Sotto determinate circostanze (http://msdn.microsoft.com/en-us/library/dd425070.aspx), questa sintassi fa sì che la INSERT sia minimally logged.

Anche se non sono state trattate in questo post, vi suggerisco di buttare un occhio anche alle altre feature del SSMS Tools Pack, che si è dimostrato essere sicuramente un altro strumento utile per il nostro lavoro quotidiano con SQL Server 🙂

Chi è Davide Mauri

Microsoft Data Platform MVP dal 2007, Davide Mauri si occupa di Data Architecture e Big Data nel mondo dell'IoT. Attualmente ricopre il ruolo di "Director Software Development & Cloud Infrastructure" in Sensoria, societa specializzata nella creazione di Wearables e sensori per l'IoT applicati a tessuti ed oggetti sportivi.

Leggi Anche

Unit testing: Come scrivere la tua prima unit test!

Nell’articolo precedente, il secondo di questa serie, abbiamo descritto come installare il framework tSQLt, il …