Sempre sulla clausola OUTPUT
Ripensando alla clausola OUTPUT introdotta in SQL Server 2005 (si veda post precedente), volevo sottolineare quanto agevoli il lavoro quando si tratta di fare più insert nella stessa istruzione dentro ad una tabella con per chiave una identity.
Mi spiego meglio.
Esempio: abbiamo una tabella tab1 con due colonne (campoA e campoB), e una tabella tab2 con tre colonne (id, campoA, campoB) dove il primo campo (id) è chiave ed è definito come identity. Entrambe le tabelle hanno un certo numero di record. Vogliamo inserire i record che abbiamo in tab1 in tab2 e vogliamo sapere quali indici sono stati assegnati a questi nuovi record.
Senza usare la clausola OUTPUT la maniera più veloce è ricorrere ad un trigger che legga la tabella “speciale” Inserted e ci restituisca i record in essa contenuti. Veloce, ma sicuramente una scelta discutibile. Usare un trigger per una cosa del genere non è proprio il massimo, anzi. Diciamolo pure: è una porcata.
Altra possibilità, sempre senza usare la clausola di OUTPUT, e che risulti meno porcata è scrivere ovviamente una query abbastanza articolata. Perchè dico articolata? Per il semplice fatto che in tab2 abbiamo già dei record e in tab1 non abbiamo una chiave definita, quindi individuare i record appena inseriti non è banale.
Veniamo quindi alla clausola OUTPUT, che come avrete intuito mi ha stregato. Sfruttandola la query di nostro interesse diventra estremamente banale, una cosa del tipo:
INSERT INTO tab2 (campoA, campoB)
OUTPUT Inserted.id, Inserted.campoA, Inserted.campoB
SELECT campoA, campoB FROM tab1
Insomma, come si fa a non amare questa istruzione?










