none
Insert into e max campo RRS feed

  • 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

    giovedì 23 febbraio 2012 07:28

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
    END

    solo che il software da ancora errore... devo vedere cosa invia di preciso come sql

    giovedì 23 febbraio 2012 08:10

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

    giovedì 23 febbraio 2012 08:03
  • 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
    END

    solo che il software da ancora errore... devo vedere cosa invia di preciso come sql

    giovedì 23 febbraio 2012 08:10
  • 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 ?

    giovedì 23 febbraio 2012 08:30
  • il trigger risponde all'esigenza del topic, per il resto ho riscritto la procedura di insert modificando il software.
    giovedì 23 febbraio 2012 08:52
  • 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

    giovedì 23 febbraio 2012 08:57