Ottenere valore campo chiave (non Identity) appena inserito.

di il
4 risposte

Ottenere valore campo chiave (non Identity) appena inserito.

Ciao a tutti.

Ho a che fare con una tabella così definita (e non posso modificarne la struttura):

CREATE TABLE [dbo].[UncObj] (
	[Codice] [int] NOT NULL,
	[DescrizioneNomenclatura] [varchar](80) NOT NULL,
	[Ubicazione] [char](6) NULL,
	[Valore] [decimal](18,3) NOT NULL,
	[Attivo] [char](1) NOT NULL,
 CONSTRAINT [PK_UncObj] PRIMARY KEY CLUSTERED 
(
	[Codice] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

Il campo Codice non è autoincrementante (non è definito come Identity).

Per l'inserimento di record uso, per esempio, questa SQL:

INSERT INTO UncObj(Codice, DescrizioneNomenclatura, Ubicazione, Valore, Attivo)
VALUES((SELECT COALESCE(MAX(Codice), 0) + 1 FROM UncObj), 'blabla', 'pippo1', 10.0, 'S');

In questo modo riesco a “simulare” un autoincrement, ma non è l'unico modo di generare quei valori (in altri casi, il campo Codice viene auto-generato richiamando una Function definita in SQL Server che fa delle considerazioni e genera il codice).

Domanda: esiste un modo (e se si come) per ottenere il valore del campo Codice generato DOPO la insert? O, in alternativa, esiste un modo (e se sì come) per ottenere TUTTO il record appena inserito?

PS: sì, tutto sarebbe stato più semplice se fosse un Identity, ma purtroppo per ragioni aziendali non può essere tale.

4 Risposte

  • Re: Ottenere valore campo chiave (non Identity) appena inserito.

    Ok, dopo 5 giorni, 16 visite e nessuna risposta, come sospettavo la risposta dev'essere “non si può fare”.  :|

    Ci ho provato.

  • Re: Ottenere valore campo chiave (non Identity) appena inserito.

    Salve,

    SI, si puo' fare… puoi utilizzare la clausola OUTPUT per catturare “il risultato” dell'operazione, vedi la relativa sinossi…

    quindi, trivialmente, 

    SET NOCOUNT ON;
    USE tempdb;
    GO
    CREATE TABLE dbo.Test (
    	Id int NOT NULL,
    	Value varchar(10)
    	);
    GO
    INSERT INTO dbo.Test
    	VALUES (1, 'A'), (2, 'B'), (5, 'E');
    GO
    
    DECLARE @MyTableVar TABLE (
    	Id int NOT NULL,
    	Value varchar(10)
    	);
    
    INSERT INTO dbo.Test
    	OUTPUT INSERTED.Id, INSERTED.Value
    		INTO @MyTableVar
    	SELECT COALESCE(MAX(Id), 0) + 1 
    		, 'blabla'
    		FROM dbo.Test;
    
    SELECT * FROM @MyTableVar;
    SELECT * FROM dbo.Test;
    GO
    DROP TABLE dbo.Test;
    --<--------------
    Id          Value
    ----------- ----------
    6           blabla
    
    Id          Value
    ----------- ----------
    1           A
    2           B
    5           E
    6           blabla
    

    poi, IMMAGINO CHE NON ti devo dire che questo tipo di valorizzazione NON vada molto bene…. :D

    salutoni romagnoli
    – 
    Andrea

  • Re: Ottenere valore campo chiave (non Identity) appena inserito.

    Intanto grazie, in tutto il mio peregrinare non mi ero mai imbattuto nella clausola OUTPUT (mi ha aperto un mondo).

    05/07/2023 - asql ha scritto:


    poi, IMMAGINO CHE NON ti devo dire che questo tipo di valorizzazione NON vada molto bene…. :D

    Dimmelo, invece, ché gli approfondimenti mi interessano.

  • Re: Ottenere valore campo chiave (non Identity) appena inserito.

    Salve,

    ottenere il MAX +1 come chiave comporta, ad ogni operazione di insert, una lookup sull'indice, operazione “veloce” ma comunque con imposizione di lock che tendenzialmente “non servono” (ok, servono al motore relazionale per effettuare tennicamente l'operazione)… e' un appesantimento evitabile :D

    e' un sistema che sicuramente ho usato in passato, anche per recuperare i gap nelle data-islands eventualmente presenti in tabella, ma sicuramente meno performante di un identity o della funzionalita' che indico sotto :D

    senza “modificare” il ddl della tabella, potresti avvalerti della funzionalita' delle Sequences, vedi sinossi, che gestiscono in maniera molto piu' performante e tennicamente gestito dal servizio la generazione del valore

    salutoni romagnoli
    – 
    Andrea

Devi accedere o registrarti per scrivere nel forum
4 risposte