19 messaggi dal 27 ottobre 2005
Arieccomi a stressarvi con le mie domande da dilettante ;-)

Come faccio a sapere quale valore è stato assegnato a un campo identity su SQL Server dopo la chiamata a una stored che effettua una insert?
L'idea sarebbe quella di usare un parametro di OUTPUT nella stored stessa, ma come?

Qualcuno mi sa suggerire?
grazie!
1.976 messaggi dal 27 luglio 2005
Contributi
salve,
schbin ha scritto:
Arieccomi a stressarvi con le mie domande da dilettante ;-)

Come faccio a sapere quale valore è stato assegnato a un campo identity su SQL Server dopo la chiamata a una stored che effettua una insert?
L'idea sarebbe quella di usare un parametro di OUTPUT nella stored stessa, ma come?

Qualcuno mi sa suggerire?
grazie!


SET NOCOUNT ON
USE tempdb
GO
CREATE TABLE dbo.Studenti (
ID int IDENTITY PRIMARY KEY ,
Nome varchar(10) NOT NULL UNIQUE
)
GO
CREATE PROCEDURE dbo.usp_InsertStudenti (
@Nome varchar(10) ,
@Id int OUTPUT
)
AS BEGIN
IF @Nome IS NULL OR LEN(LTRIM(RTRIM(@Nome))) = 0 BEGIN
RAISERROR ('Il parametro Nome deve essere valorizzato', 16, 1)
RETURN 1
END

DECLARE @err int, @row int

INSERT dbo.Studenti (Nome)
VALUES ( @Nome )

SELECT @err = @@ERROR , @row = @@ROWCOUNT
IF @Err <> 0 OR @row = 0 BEGIN
RAISERROR ('Errore %d in esecuzione; la procedura ha inserito %d righe', 16, 1, @Err , @row)
RETURN 1
END
ELSE BEGIN
SELECT @Id = SCOPE_IDENTITY()
RETURN 0
END
END
GO
DECLARE @rc int, @id int
PRINT 'Fallisce'
EXEC @rc = dbo.usp_InsertStudenti '', @id OUT
SELECT @rc AS [ReturnValue], @id AS [Nuova ID]
SELECT @rc = 0, @id = 0

PRINT 'Fallisce'
EXEC @rc = dbo.usp_InsertStudenti NULL, @id OUT
SELECT @rc AS [ReturnValue], @id AS [Nuova ID]
SELECT @rc = 0, @id = 0

PRINT 'successo'
EXEC @rc = dbo.usp_InsertStudenti 'Pippo', @id OUT
SELECT @rc AS [ReturnValue], @id AS [Nuova ID]
SELECT @rc = 0, @id = 0

PRINT 'Fallisce per violazione del vincolo univoco'
EXEC @rc = dbo.usp_InsertStudenti 'Pippo', @id OUT
SELECT @rc AS [ReturnValue], @id AS [Nuova ID]

GO
DROP PROCEDURE dbo.usp_InsertStudenti
DROP TABLE dbo.Studenti

talvolta non vengono utilizzati parametri di output bensi' il valore di RETURN n della procedura stessa, anche se le convenzioni indicano che tale valore dovrebbe essere associato a codici di errore e quindi 0 sottointende l'esecuzione con successo della procedura..
al di la' di cio', utilizza la funzione SCOPE_IDENTITY() per il recupero e restituzione di quanto a te interessante, in quanto @@IDENTITY puo' dar luogo a fraintendimenti nel caso di operazioni di inserimento a catena, vedi comunque http://msdn.microsoft.com/library/default.asp?url=/library/en-us/tsqlref/ts_sa-ses_6n8p.asp per la relativa sinopsi...
saluti

Andrea Montanari
http://www.hotelsole.com - http://www.hotelsole.com/asql/index.php

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.