Errore nella gestione di un parametro di tipo OUTPUT

lunedì 11 agosto 2008 - 10.01

trinity Profilo | Guru

buongiorno,
ho scritto al seguente stored:

ALTER PROCEDURE [dbo].[GetSchedine_new] ( @Codalbergo Int, @CodComAlbergo Int, @Data SmallDateTime, @Nrecord Int OUTPUT ) AS BEGIN SET NOCOUNT ON; SELECT ARC.codalbergo, ARC.codcomalbergo, ARC.progschedina, @Nrecord=count(ARC.progschedina), ARC.dataArrivo, ARC.DataPartenza, ARC.idstato, Nazione=N.Nazione, ARC.idcomune, Comune=C.Comune, Provincia=C.prov, ARC.idgruppo, DescrizioneGruppo=G.Descrizione FROM dbo.Archivio_mov_new ARC JOIN dbo.Nazioni N ON N.CodicePgrStatistica=ARC.Idstato JOIN dbo.Comuni C ON C.codcomune=ARC.idcomune JOIN dbo.Gruppi G ON G.Codicegruppo=ARC.idgruppo WHERE codalbergo=@codalbergo And CodComAlbergo=@CodComAlbergo And dataArrivo =@data Or DataPartenza =@Data END

e mi da il seguente messaggio di errore:
Le istruzioni SELECT per l'assegnazione di valori alle variabili non devono essere eseguite insieme a operazioni di recupero dei dati.
come mai?

Ciao
Cirillo Fabio
www.wondernet.biz
fabio@wondernet.biz
http://blogs.dotnethell.it/fabiocirillo/
http://wnetsoftware.blogspot.com

alx_81 Profilo | Guru

>buongiorno,
Ciao!

>Le istruzioni SELECT per l'assegnazione di valori alle variabili
>non devono essere eseguite insieme a operazioni di recupero dei
>dati.
>come mai?
Perchè non puoi fare select che valorizzano variabili, combinando il tutto con un elenco di campi. In poche parole, o valorizzi variabili oppure torni un resultset.
--

Alessandro Alpi | SQL Server MVP

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi
http://italy.mvps.org

trinity Profilo | Guru

e se volessi utilizzare un parametro di output?

Ciao
Cirillo Fabio
www.wondernet.biz
fabio@wondernet.biz
http://blogs.dotnethell.it/fabiocirillo/
http://wnetsoftware.blogspot.com

alx_81 Profilo | Guru

>e se volessi utilizzare un parametro di output?
nel tuo caso, puoi fare prima la select col resultset (senza var) e poi valorizzare il parametro di output a @@ROWCOUNT:

SET @NRecord = @@ROWCOUNT

>
>Ciao
>Cirillo Fabio
>www.wondernet.biz
>fabio@wondernet.biz
>http://blogs.dotnethell.it/fabiocirillo/
>http://wnetsoftware.blogspot.com

--

Alessandro Alpi | SQL Server MVP

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi
http://italy.mvps.org

lbenaglia Profilo | Guru

>e se volessi utilizzare un parametro di output?

Ciao Fabio,

Mi sembra di capire che vuoi valorizzare il parametro di output con il numero di righe restituite dalla query.
Puoi ottenere questo risultato utilizzando la funzione @@ROWCOUNT:

USE tempdb; GO CREATE PROCEDURE dbo.GetPersons( @FirstName nvarchar(50), @RowCount int OUTPUT ) AS SELECT FirstName, LastName FROM AdventureWorks2008.Person.Person WHERE FirstName = @FirstName; SET @RowCount = @@ROWCOUNT; GO DECLARE @RowCount int; EXEC dbo.GetPersons N'Gigi', @RowCount OUTPUT; SELECT @RowCount AS NrRighe; /* Output: FirstName LastName ---------- --------- Gigi Matthew (1 row(s) affected) NrRighe ----------- 1 (1 row(s) affected) */ DROP PROCEDURE dbo.GetPersons;

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

trinity Profilo | Guru

ok senti un'ultima cosa anche se non centra nulla con il post aperto ma potrebbe essere una banalità pertanto non mi va di aprire un altro post.

io in una tabella c'è il campo progschedina che è di tipo BigInt

se eseguo questa stored:

ALTER PROCEDURE [dbo].[GetSchedine_new] ( @Codalbergo Int, @CodComAlbergo Int, @Data SmallDateTime ) AS BEGIN SET NOCOUNT ON; SELECT ARC.codalbergo, ARC.codcomalbergo, ARC.progschedina, ARC.dataArrivo, ARC.DataPartenza, ARC.idstato, Nazione=N.Nazione, ARC.idcomune, Comune=C.Comune, Provincia=C.prov, ARC.idgruppo, DescrizioneGruppo=G.Descrizione FROM dbo.Archivio_mov_new ARC JOIN dbo.Nazioni N ON N.CodicePgrStatistica=ARC.Idstato JOIN dbo.Comuni C ON C.codcomune=ARC.idcomune JOIN dbo.Gruppi G ON G.Codicegruppo=ARC.idgruppo WHERE codalbergo=@codalbergo And CodComAlbergo=@CodComAlbergo And dataArrivo =@data Or DataPartenza =@Data end

funziona, richiamo i dati da vb e appena il compilatore passa sul campo di restituzione del valore progschedina mi esce errore del casto non valido.
al volo sai in vb come posso dichiara un campo bigint...perchè il data type del campo progschedina in vb è di tipo interger.

ciao
Cirillo Fabio
www.wondernet.biz
fabio@wondernet.biz
http://blogs.dotnethell.it/fabiocirillo/
http://wnetsoftware.blogspot.com

lbenaglia Profilo | Guru

>al volo sai in vb come posso dichiara un campo bigint...perchè
>il data type del campo progschedina in vb è di tipo interger.

BigInt è un intero a 64 bit:
http://safari.oreilly.com/0201758660/app01lev1sec2
http://safari.oreilly.com/0201758660/app01lev1sec5

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

alx_81 Profilo | Guru

>al volo sai in vb come posso dichiara un campo bigint...perchè
>il data type del campo progschedina in vb è di tipo interger.
Se non erro, Long oppure Int64, se parli di VBNet..
--

Alessandro Alpi | SQL Server MVP

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi
http://italy.mvps.org

trinity Profilo | Guru

Grazie mille Lorenzo, Alessandro

Senti ultima cosa; facendo il @@Rowcount quando la eseguo mi escono due tabelle virtuali, la prima dove vi sono i dati la seconda dove vi è il numero di righe.

in vb net io per prendermi i dati faccio così:

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra


ora per prendere anche le righe come dovrei fare? o devo gestire tutto da sql?


Cirillo Fabio
www.wondernet.biz
fabio@wondernet.biz
http://blogs.dotnethell.it/fabiocirillo/
http://wnetsoftware.blogspot.com

lbenaglia Profilo | Guru

>Senti ultima cosa; facendo il @@Rowcount quando la eseguo mi
>escono due tabelle virtuali, la prima dove vi sono i dati la
>seconda dove vi è il numero di righe.

Se hai usato la SET ne dubito.

>in vb net io per prendermi i dati faccio così:
<SNIP>
Definisci il parametro di output e dopo la Execute vai a leggere il suo valore.

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

trinity Profilo | Guru

ok grazie ciao
Cirillo Fabio
www.wondernet.biz
fabio@wondernet.biz
http://blogs.dotnethell.it/fabiocirillo/
http://wnetsoftware.blogspot.com
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5