2011-01-04 1 views
6

Quando si scrive un'istruzione INSERT con molte colonne, sarebbe bello avere il valore accanto al nome della colonna come in un'istruzione UPDATE. Qualcosa di simile:Scrivi istruzioni INSERT con valori accanto ai nomi delle colonne?

insert into myTable 
set 
    [col1] = 'xxx', 
    [col2] = 'yyy', 
    [col3] = 42 
    etc... 

Ci sono trucchi per simulare questo?

Pensavo su qualcosa con questo:

insert into myTable 
select 
    [col1] = 'xxx', 
    [col2] = 'yyy', 
    [col3] = 42 
    etc... 

Ma gli alias non sono effettivamente associati con colonne della tabella di inserimento e se qualcuno ha aggiunto una nuova colonna alla tabella potrebbe davvero rovinare tutto . Qualcuno ha altre idee su come si potrebbe fare questo?

+0

Questo è uno dei veri fastidi di SQL.E causa errori, poiché è facile ottenere l'ordine modificato per sbaglio e se i tipi di dati sono compatibili, improvvisamente stai mettendo il numero di telefono nella colonna di posta elettronica senza errori. – HLGEM

+0

Anche io desidero che SQL fornisca un modo per farlo. Migliorerebbe notevolmente la leggibilità. –

risposta

9

Il più vicino si arriva sarebbe quello di specificare le colonne sull'inserto (questo vi proteggerà dalla tua preoccupazione che si aggiunge una nuova colonna) e alias i valori sul select (che ti dà un certo grado di codice auto-documentante).

insert into myTable 
    ([col1], [col2], [col3]) 
    select 'xxx' as [col1], 'yyy' as [col2], 42 as [col3] 
+0

Gli alias non sono richiesti, presupponendo che l'ordine di selezione corrisponda all'ordine in colonna. Anche se potrebbero aiutare a mantenere le cose chiaramente indicate. :) –

+0

@Rocky Madden: approvato. Come ho indicato nella mia risposta, ho incluso gli alias più come un tentativo di auto-documentare il codice. –

+0

Volevo solo assicurarmi che fosse chiaro all'OP. Come al solito, avevi ragione sui soldi! –

-3

INSERT INTO myTable (col1, col2, col3) 
SELECT 'xxx' [col1], 'yyy' [col2], '42' [col3]
+0

È lo stesso dell'esempio che ho dato. Non voglio questo perché se qualcuno aggiunge una colonna a myTable potrebbe potenzialmente inserire dati nella colonna sbagliata. – adam0101

+0

In nessun caso si dovrebbe mai inserire un inserto senza specificare la colonna nell'inserto. Questo è un brutto male codice cattivo. – HLGEM

+0

Sono d'accordo, ho letto male la domanda. Modificato – brian

1

Per inserti di grandi dimensioni, ho creato layout fantasiosi (e forse pignoli). Alcuni esempi:

INSERT MyTable (MyTableId,  Name,    Description,  SomeStringData1 
       ,SomeStringData2, SomeStringData3, SomeStringData4, MoreStringData1 
       ,MoreStringData2, MoreStringData3, MoreStringData4, SomeNumericData1 
       ,SomeNumericData2, SomeNumericData3, SomeNumericData4, MoreNumericData1 
       ,MoreNumericData2, MoreNumericData3, MoreNumericData4, BigBlobAA 
       ,BigBlobBB,  EnteredAtDate, UpdatedAtDate, RevisedAtDate 
       ,NeedAnotherDate) 
values 
       (@MyTableId,  @Name,    @Description,  @SomeStringData1 
       ,@SomeStringData2, @SomeStringData3, @SomeStringData4, @MoreStringData1 
       ,@MoreStringData2, @MoreStringData3, @MoreStringData4, @SomeNumericData1 
       ,@SomeNumericData2, @SomeNumericData3, @SomeNumericData4, @MoreNumericData1 
       ,@MoreNumericData2, @MoreNumericData3, @MoreNumericData4, @BigBlobAA 
       ,@BigBlobBB,  @EnteredAtDate, @UpdatedAtDate, @RevisedAtDate 
       ,@NeedAnotherDate) 

questo funziona se si è maledettamente certo che voi non siate mai l'inserimento di colonne o in altro modo modificare ciò che viene inserito. Ottiene tutto in uno schermo e rende abbastanza semplice individuare il valore da assegnare a quale colonna.

Se i valori inseriti sono suscettibili di modificare o sono complesse (come ad esempio istruzioni case), faccio la seguente (outdent tutto ma ogni quinto punto):

INSERT MyTable 
    (
    MyTableId 
    ,Name 
    ,Description 
    ,SomeStringData1 
    ,SomeStringData2 
    ,SomeStringData3 
    ,SomeStringData4 
    ,MoreStringData1 
    ,MoreStringData2 
    ,MoreStringData3 
    ,MoreStringData4 
    ,SomeNumericData1 
    ,SomeNumericData2 
    ,SomeNumericData3 
    ,SomeNumericData4 
    ,MoreNumericData1 
    ,MoreNumericData2 
    ,MoreNumericData3 
    ,MoreNumericData4 
    ,BigBlobAA 
    ,BigBlobBB 
    ,EnteredAtDate 
    ,UpdatedAtDate 
    ,RevisedAtDate 
    ,NeedAnotherDate 
) 
values 
    (
    MyTableId 
    ,Name 
    ,Description 
    ,SomeStringData1 
    ,SomeStringData2 
    ,SomeStringData3 
    ,SomeStringData4 
    ,MoreStringData1 
    ,MoreStringData2 
    ,MoreStringData3 
    ,MoreStringData4 
    ,case 
     when something then 'A' 
     when orOther then 'B' 
     else 'Z' 
    end 
    ,SomeNumericData2 
    ,SomeNumericData3 
    ,SomeNumericData4 
    ,MoreNumericData1 
    ,MoreNumericData2 
    ,MoreNumericData3 
    ,MoreNumericData4 
    ,BigBlobAA 
    ,BigBlobBB 
    ,EnteredAtDate 
    ,UpdatedAtDate 
    ,RevisedAtDate 
    ,NeedAnotherDate 
) 

(Dopo aver aggiunto che istruzione CASE, I " contati i rientri "per assicurarsi che tutto fosse allineato correttamente.)

Ci vuole un po 'di sforzo per sistemare le cose correttamente, ma può semplificare la manutenzione, il supporto e le successive modifiche.

+0

Sono con te, personalmente, ho bisogno di molte colonne per allineare le colonne tre o quattro a una riga e fare in modo che la linea della clausola selct o values ​​corrisponda esattamente. Devo ancora chack manualmente, ma almeno è più facile quando le colonne sono allineate correttamente come nel tuo primo esempio. – HLGEM

0

Una volta che si desidera inserire più righe contemporaneamente, utilizzando sia 2008 Costruttori di riga stile, o utilizzando la vecchia sintassi union all, si tende ad essere grati che si non devono specificare i nomi delle colonne per ogni riga.

2008 Costruttori di riga:

insert into myTable (col1,col2,col3) 
values ('xxx','yyy',42), 
('abc','def',19), 
('HJK','www',-4) 

UNION ALL:

insert into myTable (col1,col2,col3) 
select 'xxx','yyy',42 union all 
select 'abc','def',19 union all 
select 'HJK','www',-4 
+0

Sì, posso vedere che non voglio i nomi delle colonne se stai inserendo più righe, ma mi riferivo all'inserimento di una singola riga con molte e molte colonne. – adam0101

1

In sostanza, no. La sintassi per SQL INSERT è l'elenco di tutte le colonne, quindi tutti i valori. Anche se si riuscisse a trovare un trucco per esprimere la sintassi nel modo desiderato, sarebbe non portatile e confondere la prossima persona a mantenere il proprio codice.

Se si desidera che una mappatura visiva di colonne ai valori utilizzi qualcosa sulla falsariga della risposta di Philip, sopra. Ma per favore non spendere il tuo tempo prezioso per fare in modo che il tuo codice eviti la sintassi standard.

+0

Bene, a volte cerco modi per rendere le cose più belle per me stesso, ma non dovrei mai farlo con l'effetto collaterale di rendere il mio codice illeggibile o confuso. – adam0101

+0

Apprezzo da dove vieni, e faccio spesso layout come suggerito da Philip (eccetto che cerco di stare su una riga in modo che il valore sia direttamente sotto il nome della colonna, anche se la linea è molto, molto lunga). –