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