Principale utente con più risposte
Insert into e max campo

Domanda
-
ciao a tutti, un software esegue un insert into in una mia tabella di un database sql server.
Ora a questa tabella ho aggiunto un campo "Ordine" non nullabile smallint, che mi serve per eseguere un ordinamento tipo
Select * from MIatabella order by Ordine
Avrei esigenza senza modificare la procedura di insert, lato sql server durante l'insert nella tabella ottenere il max(ordine) + 1 e inserirlo nel campo Ordine
è fattibile la cosa ? trigger forse ?
ciao grazie
Risposte
-
non uso identity perchè ne ho già una di pk identity.
ora con questo trigger lato sql sembra andare
ALTER TRIGGER [dbo].[Istrg]
ON [dbo].[Prodotti]
INSTEAD OF INSERT
AS
BEGIN
INSERT INTO Prodotti(NomeProdotto, hw, Occhiello, DescrizioneShort, DescrizioneLunga, foto, logo, pdf, fotomini, visibile, keyword, Ordine)
SELECT NomeProdotto, hw, Occhiello, DescrizioneShort, DescrizioneLunga, foto, logo, pdf, fotomini, visibile, keyword, (SELECT COALESCE(MAX(ordine), 0) + 1 FROM prodotti) AS mx
FROM inserted
ENDsolo che il software da ancora errore... devo vedere cosa invia di preciso come sql
- Contrassegnato come risposta Alessandro Andreatta giovedì 23 febbraio 2012 08:51
Tutte le risposte
-
Ma nel caso di una insert di più record contemporaneamente ogni record deve avere un valore progressivo?
Da quanto ho capito nel tuo caso l'ordinamento è semplicemente un progressivo di inserimento senza un significato dipendente da un attributo del record.
C'è un motivo per cui non usi una colonna int di tipo identity(1,1)? Perchè in quel caso avresti un ordinamento automatico e non ti servirebbero trigger.
Se no come dici giustamente tu l'alternativa è appunto un trigger o, quando (se) passerai a SQL Server 2012 l'oggetto SEQUENCE (qui un articolo di Sergio a riguardo).
Ciao!
Francesco Milano // .NET & SQL Server Consultant // blog // twitter
-
non uso identity perchè ne ho già una di pk identity.
ora con questo trigger lato sql sembra andare
ALTER TRIGGER [dbo].[Istrg]
ON [dbo].[Prodotti]
INSTEAD OF INSERT
AS
BEGIN
INSERT INTO Prodotti(NomeProdotto, hw, Occhiello, DescrizioneShort, DescrizioneLunga, foto, logo, pdf, fotomini, visibile, keyword, Ordine)
SELECT NomeProdotto, hw, Occhiello, DescrizioneShort, DescrizioneLunga, foto, logo, pdf, fotomini, visibile, keyword, (SELECT COALESCE(MAX(ordine), 0) + 1 FROM prodotti) AS mx
FROM inserted
ENDsolo che il software da ancora errore... devo vedere cosa invia di preciso come sql
- Contrassegnato come risposta Alessandro Andreatta giovedì 23 febbraio 2012 08:51
-
il problema è che dopo la insert , il software fà select idProdotto from [dbo].[Prodotti]
where @@ROWCOUNT > 0 and [idProdotto] = scope_identity()e non gli viene ritornato nulla, pertanto si arrabbia
è possibile far funzionare quel trigger sopra in modo che il software non si accorga di nulla ?
-
-
il trigger risponde all'esigenza del topic, per il resto ho riscritto la procedura di insert modificando il software.
Ah ottimo, stavo per scriverti perchè non usare un "AFTER INSERT" in cui fare udpate dei record inseriti piuttosto che "legarti" alla procedura attuale riscrivendo l'insert nel tuo trigger. Ma se così risolvi meglio :)
Ciao!
Francesco Milano // .NET & SQL Server Consultant // blog // twitter