Salve a tutti, sto facendo un gestionale di magazzino, e sto curando la procedura di scarico.

Ho fatto una stored procedure semplicissima, che non si occupa di salvare i dati, ma semplicemente di pescare il record di scarico salvato e di affibiargli un numero progressivo (inizialmente salvo il record con numero=0). Passo come parametri l'ID del record del documento (pk) e il l'ID del tipo documento (ci possono essere documenti di tipo diverso, con numerazioni diverse).

Lo scopo è ripescare come parametro di ritorno il numero di documento salvato

La procedura è la seguente:

codice:
ALTER PROCEDURE AGGIORNA_PROGRESSIVO
	@IDDOCUMENTO INT,
	@IDTIPODOCUMENTO INT,
	@NUMERODOC INT OUTPUT
AS
BEGIN
	SET NOCOUNT ON;
	
	SET TRANSACTION ISOLATION  LEVEL SERIALIZABLE
	BEGIN TRANSACTION
		UPDATE Documenti.Scarico SET NUMERO = (SELECT MAX(NUMERO)+1 FROM DOCUMENTI.Scarico WHERE IDTIPODOCUMENTO=@IDTIPODOCUMENTO) WHERE ID=@IDDOCUMENTO AND NUMERO = 0
	COMMIT
	SELECT @NUMERODOC = NUMERO FROM DOCUMENTI.Scarico WHERE ID=@IDDOCUMENTO
	RETURN @NUMERODOC
END
Da vb 2010, questo è il codice per ripescare il parametro di ritorno

codice:
Function Salva() as integer
            Dim Cmd As New SqlClient.SqlCommand
            Cmd.CommandType = CommandType.StoredProcedure
            Cmd.Connection = cnConnessione
            Cmd.CommandText = "AGGIORNA_PROGRESSIVO"
            Dim p As New SqlClient.SqlParameter("NUMERODOC", SqlDbType.Int)
            p.Direction = ParameterDirection.ReturnValue
            Cmd.Parameters.Add(p)
            Cmd.Parameters.AddWithValue("IDDOCUMENTO", ritorno)
            Cmd.Parameters.AddWithValue("IDTIPODOCUMENTO", IDTIPODOCUMENTO)

            Cmd.ExecuteNonQuery()

            Return Cmd.Parameters("NUMERODOC").Value

End Function
ritorno è un variabile contenete l'ID del documento appena salvato. Non vi posto il codice di salvataggio, tanto quello funziona.

Ecco il problema: da codice mi dice che la procedura necessita di un valore per NUMERODOC, ma se provo ad eseguire la stored dal management studio, funziona, fa l'update e mi ritorna il parametro di ritorno.

Cosa c'è che non va ?
E il tipo di transazione? Il programma verrà usato da più pc, è ho pensato che isolare la procedura quando viene chiamata poteva essere una buona soluzione per ritrovarmi con numeri di documento doppi o tripli o peggio.