Visualizzazione dei risultati da 1 a 9 su 9
  1. #1
    Utente bannato
    Registrato dal
    Jun 2004
    Messaggi
    1,117

    Stored procedure SQL con recupero dell'ultimo ID

    Ho una query di insert che effettua il salvataggio di un elemento di testata
    all'interno di una tabella... come posso fare in modo che la query mi
    ritorni l'ID di salvataggio, per poi salvare il detail?? Questo per evitare
    di dover recuperare l'ID facendo un sort per ID Desc (soluzione che non mi
    piace molto)


    ...quello che vorrei ottenere è il risultato dell'operazione (quindi se l'insert è avvenuto con successo) e l'ID dell'ultimo insert

    Fin'ora sono arrivata a questo punto...

    Grazie infinite per l'aiuto!


    -- =============================================
    -- Author: <Author,,Name>
    -- Create date: <Create Date,,>
    -- Description: <Description,,>
    -- =============================================
    ALTER PROCEDURE [dbo].[st_Documenti_TestataInsert]
    (
    @tipodocumento varchar,
    @stato varchar,
    @IDClienti int,
    @anno int,
    @numero int...
    @vEsito int OUTPUT
    )

    AS
    -- dichiaro le variabili
    declare @Errore int

    -- setto i valori
    set @Errore = 0
    set @vEsito = 0

    BEGIN TRANSACTION

    SET NOCOUNT ON;

    INSERT INTO OrdiniVenditaTestata (tipodocumento,stato,IDClienti,....
    numprog,IDRegIva,modoreg,numpn,annopn,Tipo,tiporeg ) VALUES
    (@tipodocumento,@stato,@IDClienti,.....)


    SELECT SCOPE_IDENTITY()

    -- Controllo esito dell'operazione
    SET @Errore=@@error
    if(@Errore!=0)
    begin
    set @vEsito = @@error
    goto finally
    end

    -- ramo finally per commit o rollback
    finally:

    -- se nessun errore eseguo il commit della transazione
    if (@Errore = 0) and (@vEsito = 0)
    begin
    -- commit della transazione della conferma corrente
    commit transaction
    end
    else
    begin
    -- rollback della transazione per la conferma corrente
    rollback transaction
    end

    return @vEsito





    DBManager dbMananger = new DBManager();
    int spResult = -1;
    string qry = "st_Documenti_DettaglioRigheInsert";
    dbMananger.OpenConn();
    SqlCommand cmd = new SqlCommand(qry);
    cmd.CommandType = CommandType.StoredProcedure;
    cmd.CommandText = qry;


    cmd.Parameters.Add(new SqlParameter("@tipodocumento",
    tipodocumento));
    cmd.Parameters.Add(new SqlParameter("@stato", Stato));
    cmd.Parameters.Add(new SqlParameter("@IDClienti",
    IDClienti));
    cmd.Parameters.Add(new SqlParameter("@anno", anno));
    cmd.Parameters.Add(new SqlParameter("@numero", numero));
    ....


    //Gestione parametro di OUTPUT
    SqlParameter outputParameter = new SqlParameter();
    outputParameter.ParameterName = "@vEsito";
    outputParameter.SqlDbType = SqlDbType.Int;
    outputParameter.Direction = ParameterDirection.Output;
    cmd.Parameters.Add(outputParameter);

    cmd.Connection = dbMananger.dbconn;
    cmd.ExecuteNonQuery();
    spResult = Convert.ToInt16(cmd.Parameters["@vEsito"].Value);
    dbMananger.CloseConn();

  2. #2
    La variabile @@IDENTITY restituisce l'ultimo ID generato dall'sqlserver:

    DECLARE @UltimoID AS INT
    INSERT INTO tabella VALUES (....)
    SET @UltimoID=@@IDENTITY


  3. #3
    Utente bannato
    Registrato dal
    Jun 2004
    Messaggi
    1,117
    Grazie mille!! Quindi invece di:

    SELECT SCOPE_IDENTITY()

    dopo la select dovrei mettere

    SET @UltimoID=@@IDENTITY

    ???

    a questo punto, seguendo la mia logica, come posso ottenere anche questo valore nel codice?? Dato che recupero già l'esito dell'operzione @vEsito??

    Grazie ancora per l'aiuto

  4. #4
    Si, certo.
    Una volta assegnato ad una variabile puoi farlo tornare indietro o sottoforma di parametro o sottoforma di query (e quindi popolabile mediante recordset):

    SELECT @UltimoID AS UltimoID, @vEsito AS Esito


  5. #5
    Utente bannato
    Registrato dal
    Jun 2004
    Messaggi
    1,117
    Scusa ma non ho capito ... ho postato un esempio di SP nella quale ritorno un esito e lo recupero da codice (come postato), vorrei capire se (e in che modo) è possibile recuperare anche l'ID da codice ... che modifiche devo fare alla SP??

    Grazie ancora

  6. #6
    Utente di HTML.it L'avatar di cassano
    Registrato dal
    Aug 2004
    Messaggi
    3,002
    Se ti interessa io uso un modo senza le storeprocedure.

  7. #7
    Utente bannato
    Registrato dal
    Jun 2004
    Messaggi
    1,117
    Grazie per il suggerimento, ma vorrei gestire tutto all'interno della SP

  8. #8
    Originariamente inviato da valeria75
    Grazie mille!! Quindi invece di:

    SELECT SCOPE_IDENTITY()

    dopo la select dovrei mettere

    SET @UltimoID=@@IDENTITY

    ???

    a questo punto, seguendo la mia logica, come posso ottenere anche questo valore nel codice?? Dato che recupero già l'esito dell'operzione @vEsito??

    Grazie ancora per l'aiuto
    Aggiungi @UltimoID come parametro in OUTPUT:

    codice:
    ALTER PROCEDURE [dbo].[st_Documenti_TestataInsert]
    (
    @tipodocumento varchar,
    @stato varchar,
    @IDClienti int,
    @anno int,
    @numero int...
    @vEsito int OUTPUT,
    @UltimoID OUTPUT
    )
    
    AS
    -- dichiaro le variabili
    declare @Errore int
    
    -- setto i valori
    set @Errore = 0
    set @vEsito = 0
    
    BEGIN TRANSACTION
    
    SET NOCOUNT ON;
    
    INSERT INTO OrdiniVenditaTestata (tipodocumento,stato,IDClienti,....
    numprog,IDRegIva,modoreg,numpn,annopn,Tipo,tiporeg) VALUES
    (@tipodocumento,@stato,@IDClienti,.....)
    SELECT @UltimoID=@@IDENTITY
    
    ....
    E recupera il valore di UltimoID come fai per l'altro parametro vEsito.


  9. #9
    Utente bannato
    Registrato dal
    Jun 2004
    Messaggi
    1,117
    Grazie per l'aiuto!

    Domani provo!

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.