Inserire i dati

Completato

Transact-SQL offre diversi modi per inserire righe in una tabella.

Istruzione INSERT

L'istruzione INSERT viene usata per aggiungere una o più righe a una tabella. Esistono diverse forme dell'istruzione.

Di seguito è riportata la sintassi di base di un'istruzione INSERT semplice:

INSERT [INTO] <Table> [(column_list)]
VALUES ([ColumnName or an expression or DEFAULT or NULL],…n)

Con questa forma dell'istruzione INSERT, denominata INSERT VALUES, è possibile specificare le colonne in cui verranno inseriti valori e l'ordine in cui i dati verranno presentati per ogni riga inserita nella tabella. L'uso di column_list è facoltativo ma consigliato. Senza column_list, l'istruzione INSERT prevede un valore per ogni colonna della tabella nell'ordine in cui sono state definite le colonne. È anche possibile specificare i valori per tali colonne come un elenco delimitato da virgole.

Quando si elencano i valori, verrà usata la parola chiave DEFAULT che indica un valore predefinito, specificato al momento della creazione della tabella. È possibile determinare un valore predefinito in tre modi:

  • Se una colonna è stata definita per avere un valore generato automaticamente, verrà usato tale valore. I valori generati automaticamente verranno illustrati più avanti in questo modulo.
  • Quando viene creata una tabella, è possibile specificare un valore predefinito per una colonna; tale valore verrà usato se si specifica DEFAULT.
  • Se una colonna, che non è stata generata automaticamente e non dispone di un valore predefinito, è stata definita per consentire i valori NULL, questi verranno inseriti come DEFAULT.

I dettagli sulla creazione della tabella non rientrano nell'ambito di questo modulo. È tuttavia spesso utile sapere quali colonne si trovano in una tabella e il modo più semplice è di eseguire un'istruzione SELECT nella tabella senza che vengano restituite righe. Usando una condizione WHERE che non può mai essere TRUE, non possono essere restituite righe.

SELECT * FROM Sales.Promotion
WHERE 1 = 0;

Questa istruzione mostrerà tutte le colonne e i relativi nomi, ma non i tipi di dati o le proprietà, ad esempio se sono consentiti i valori NULL o se sono specificati valori predefiniti. Di seguito è riportato un esempio di un possibile output della query:

PromotionName

StartDate

ProductModelID

Sconto

Note

Per inserire dati in questa tabella, è possibile usare l'istruzione INSERT come illustrato di seguito.

INSERT INTO Sales.Promotion (PromotionName,StartDate,ProductModelID,Discount,Notes)
VALUES
('Clearance Sale', '01/01/2021', 23, 0.1, '10% discount');

Per l'esempio riportato sopra, è possibile omettere l'elenco di colonne, perché viene fornito un valore per ogni colonna nell'ordine corretto:

INSERT INTO Sales.Promotion
VALUES
('Clearance Sale', '01/01/2021', 23, 0.1, '10% discount');

Si supponga che la tabella venga definita in modo che alla colonna StartDate venga applicato un valore predefinito della data corrente e che la colonna Notes consenta i valori NULL. È possibile indicare che si desidera usare questi valori in modo esplicito, come illustrato di seguito:

INSERT INTO Sales.Promotion
VALUES
('Pull your socks up', DEFAULT, 24, 0.25, NULL);

In alternativa, è possibile omettere i valori nell'istruzione INSERT; in tal caso verrà usato il valore predefinito, se definito, e se non è presente alcun valore predefinito ma la colonna consente i valori NULL, verrà inserito un valore NULL. Se non si specificano valori per tutte le colonne, è necessario disporre di un elenco di colonne che indica i valori della colonna che vengono specificati.

INSERT INTO Sales.Promotion (PromotionName, ProductModelID, Discount)
VALUES
('Caps Locked', 2, 0.2);

Oltre a inserire una singola riga alla volta, l'istruzione INSERT VALUES può essere usata per inserire più righe specificando più set di valori delimitati da virgole. Anche i set di valori sono separati da virgole, come indicato di seguito:

(col1_val,col2_val,col3_val),
(col1_val,col2_val,col3_val)

Questo elenco di valori è noto come costruttore di valori di tabella. Di seguito è riportato un esempio di inserimento di altre due righe nella tabella con un costruttore di valori di tabella:

INSERT INTO Sales.Promotion
VALUES
('The gloves are off!', DEFAULT, 3, 0.25, NULL),
('The gloves are off!', DEFAULT, 4, 0.25, NULL);

INSERT ... SELECT

Oltre a specificare un set letterale di valori in un'istruzione INSERT, T-SQL supporta anche l'uso dei risultati di altre operazioni in modo da specificare valori per INSERT. È possibile usare i risultati di un'istruzione SELECT o l'output di una stored procedure per specificare i valori per l'istruzione INSERT.

Per usare INSERT con un'istruzione SELECT annidata, compilare un'istruzione SELECT in modo che sostituisca la clausola VALUES. Con questa forma, denominata INSERT SELECT, è possibile inserire il set di righe restituito da una query SELECT in una tabella di destinazione. L'uso di INSERT SELECT prevede le stesse considerazioni di INSERT VALUES:

  • Facoltativamente, è possibile specificare un elenco di colonne in base al nome della tabella.
  • Per ciascuna colonna è necessario specificare valori di colonna, DEFAULT o NULL.

La sintassi seguente illustra l'uso di INSERT SELECT:

INSERT [INTO] <table or view> [(column_list)]
SELECT <column_list> FROM <table_list>...;

Nota

I set di risultati delle stored procedure (o anche dei batch dinamici) possono essere usati anche come input per un'istruzione INSERT. Questa forma di INSERT, denominata INSERT EXEC, è concettualmente simile a INSERT SELECT e prevede le stesse considerazioni. Le stored procedure possono tuttavia restituire più set di risultati, quindi è necessaria una maggiore attenzione.

Nell'esempio seguente vengono inserite più righe per una nuova promozione denominata Get Framed tramite il recupero dell'ID modello e del nome del modello dalla tabella Production.ProductModel per ciascun modello che contiene "frame" nel nome.

INSERT INTO Sales.Promotion (PromotionName, ProductModelID, Discount, Notes)
SELECT DISTINCT 'Get Framed', m.ProductModelID, 0.1, '10% off ' + m.Name
FROM Production.ProductModel AS m
WHERE m.Name LIKE '%frame%';

A differenza di una sottoquery, l'istruzione SELECT annidata usata con INSERT non è racchiusa tra parentesi.

SELECT ... INTO

Un'altra opzione per l'inserimento di righe, simile a INSERT SELECT, è l'istruzione SELECT INTO. La differenza principale tra INSERT SELECT e SELECT INTO è che non è possibile usare SELECT INTO per inserire righe in una tabella esistente, perché crea sempre una nuova tabella basata sul risultato dell'istruzione SELECT. Ciascuna colonna nella nuova tabella avrà lo stesso nome, tipo di dati e supporto dei valori Null della colonna (o espressione) corrispondente nell'elenco SELECT.

Per usare SELECT INTO, aggiungere INTO <nome_nuova_tabella> nella clausola SELECT della query, appena prima della clausola FROM. Nell'esempio riportato di seguito vengono estratti i dati dalla tabella Sales.SalesOrderHeader in una nuova tabella denominata Sales.Invoice.

SELECT SalesOrderID, CustomerID, OrderDate, PurchaseOrderNumber, TotalDue
INTO Sales.Invoice
FROM Sales.SalesOrderHeader;

Un'istruzione SELECT INTO avrà esito negativo se esiste già una tabella con il nome specificato dopo INTO. Dopo la creazione, la tabella può essere considerata come qualsiasi altra tabella. È possibile selezionarla, unirla ad altre tabelle o inserirvi altre righe.