La differenza non è nascosta - semplicemente i tuoi esempi non lo illustrano: -)
L'uso della sintassi INSERT TableName (Column1, Column2) VALUES ...
limita le opzioni agli elenchi di valori (come nei tuoi esempi, nota che l'elenco valori dovrebbe essere racchiuso tra parentesi) o il valore di ritorno della stored procedure, ad es.
INSERT INTO Cities (Location) VALUES ( dbo.CreateNewPoint(x, y) );
L'uso della sintassi INSERT TableName (Column1, Column2) SELECT ...
è molto più potente. Oltre ai casi precedenti puoi inserire quasi tutti i risultati dell'istruzione SELECT
se solo corrispondono a tipi di colonne di destinazione.
In particolare è possibile inserire dati da altre tabelle, mescolare valori da più tabelle con valori costanti, ecc. Ad esempio:
INSERT INTO TargetTable (name, ColumnA, ColumnB, Sum)
SELECT 'Programmers', T1.Value, T2.Value, SUM(T1.Value, T2.Value)
FROM SourceTable1 T1, SourceTable2 T2 WHERE T1.Value > 0 AND T2.Value > 0;
Tieni presente che INTO
è una parola chiave facoltativa che può essere utilizzata tra INSERT
e la tabella di destinazione.
Riferimento: link