Newsgroup: it.comp.lang.visual-basic
Titolo: [OT] SQL Server: eseguire sp

Ciao a Tutti!!!
Ho un problema con una stored_procedure. 
All'interno della sp dopo la dichiarazione delle variabili ho una select
che mi restituisce delle informazioni (ovvero il nome, la data iniziale,
la data finale, il responsabile attività e il responsabile dell'evento) di
una certa attività.
 
SELECT @strCorpo =
dbo.fn_CreaCorpoMail(IDAttività,ISNULL(Attività,''''),ISNULL(Descrizione,''''),ISNULL(CAST(DataInizio
AS VARCHAR),''''),ISNULL(CAST(DataFine AS
VARCHAR),''''),ISNULL(ResponsabileEvento,'''')),@DataPreavviso =
DataPreavviso,@DataInizio =DataInizio,@DataFine = DataFine,@strMailAtt =
EmailAttività, 
@strMailEve = EmailEvento, @intIDRuolo = IDRuolo,
@intPreavvisoRespAtt = PreavvisoRespAtt, @intPreavvisoRespEve =
PreavvisoRespEve, @intPreavvisoAmministratore = PreavvisoAmministratore,
@intScadenzaRespAtt = ScadenzaRespAtt, @intScadenzaRespEve =
ScadenzaRespEve, @intScadenzaAmministratore = ScadenzaAmministratore,
@intScadenzaCapoArea = ScadenzaCapoArea, @intAmministratoreAttività =
AmministratoreAttività, @intAmministratoreEvento = AmministratoreEvento
FROM view_DatiMail_NEW
Se scrivo print @strCorpo e poi EXEC (@strCorpo) quando vado ad eseguire
la sp in SQL Analyzer, ottengo si le informazioni dell'attività, ma anche
tre messaggi di errore che non riesco a capire:
Server: messaggio 170, livello 15, stato 1, riga 1
Riga 1: sintassi non corretta in prossimità di 'Data'.
Server: messaggio 132, livello 15, stato 1, riga 1
L'etichetta 'Attività' è già stata dichiarata. In un batch di query o in
una stored procedure i nomi di etichetta devono essere univoci.
Server: messaggio 132, livello 15, stato 1, riga 1
L'etichetta 'Attività' è già stata dichiarata. In un batch di query o in
una stored procedure i nomi di etichetta devono essere univoci.
Ma che vuol dire? 
Avrei l'esigenza di eseguire la sp per poter associare il risultato a un
recordset, in visual basic.
Cosa dovrei fare? 
Grazie Mille a Tutti!!!
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

Quella che hai postato è la chiamata alla stored procedure
mediante select ed è chiaro che con solo questa non
potremmo fare un gran che.
Se posti il ddl, forse si può anche capire il perchè ti chiede
tre variabili che sembra non gli passi in modo corretto o
hai effettivamente ridichiarato.
-- 
Saluti
Andrea Moro

[Andrea Moro] ha scritto:

Ecco il codice della mia sp.
CREATE PROCEDURE sp_InviaMail
AS
DECLARE @strMailAtt VARCHAR(20), @strMailEve VARCHAR(20), @strCorpo
VARCHAR(7000)
DECLARE @DataPreavviso VARCHAR (20), @DataInizio VARCHAR (20), @DataFine
VARCHAR (20)
DECLARE @intPreavvisoRespAtt INT, @intPreavvisoRespEve INT,
@intPreavvisoAmministratore INT
DECLARE @intScadenzaRespAtt INT, @intScadenzaRespEve INT,
@intScadenzaAmministratore INT, @intScadenzaCapoArea INT
DECLARE @intAmministratoreAttività INT, @intAmministratoreEvento INT
DECLARE @intIDRuolo INT
DECLARE @Concatena VARCHAR (7000)
 
DECLARE @strDestinatario VARCHAR(100), @strCopiaConoscenza VARCHAR(100),
@strStored VARCHAR (7000)
DECLARE @strOraApp VARCHAR (5), @strMSG  VARCHAR (100), @DATAAPP VARCHAR
(50), @strOdierna VARCHAR (20), @Giorni INT
 
SELECT @strCorpo =
dbo.fn_CreaCorpoMail(IDAttività,ISNULL(Attività,''''),ISNULL(Descrizione,''''),ISNULL(CAST(DataInizio
AS VARCHAR),''''),ISNULL(CAST(DataFine AS
VARCHAR),''''),ISNULL(ResponsabileEvento,'''')),@DataPreavviso =
DataPreavviso,@DataInizio =DataInizio,@DataFine = DataFine,@strMailAtt =
EmailAttività, @strMailEve = EmailEvento, @intIDRuolo = IDRuolo,
@intPreavvisoRespAtt = PreavvisoRespAtt, @intPreavvisoRespEve =
PreavvisoRespEve, @intPreavvisoAmministratore = PreavvisoAmministratore,
@intScadenzaRespAtt = ScadenzaRespAtt, @intScadenzaRespEve =
ScadenzaRespEve, @intScadenzaAmministratore = ScadenzaAmministratore,
@intScadenzaCapoArea = ScadenzaCapoArea,
@intAmministratoreAttività = AmministratoreAttività,
@intAmministratoreEvento = AmministratoreEvento
FROM view_DatiMail_NEW
PRINT  @strCorpo
EXEC (@strCorpo)
GO


Andiamo con ordine e diamo una ripulitina per capirci.
CREATE PROCEDURE sp_InviaMail
AS
    DECLARE     @strMailAtt VARCHAR(20)
                        , @strMailEve VARCHAR(20)
                        , @strCorpo VARCHAR(7000)
                        , @DataPreavviso VARCHAR (20)
                        , @DataInizio VARCHAR (20)
                        , @DataFine  VARCHAR (20)
                        , @intPreavvisoRespAtt INT
                        , @intPreavvisoRespEve INT,
                        ,@intPreavvisoAmministratore INT
                        ,@intScadenzaRespAtt INT
                        , @intScadenzaRespEve INT
                        , @intScadenzaAmministratore INT
                        , @intScadenzaCapoArea INT
                        , @intAmministratoreAttività INT
                        , @intAmministratoreEvento INT
                        ,@intIDRuolo INT
                        ,@Concatena VARCHAR (7000)
                        ,@strDestinatario VARCHAR(100)
                        , @strCopiaConoscenza VARCHAR(100)
                        , @strStored VARCHAR (7000)
                        ,@strOraApp VARCHAR (5)
                        , @strMSG  VARCHAR (100)
                        , @DATAAPP VARCHAR (50)
                        , @strOdierna VARCHAR (20)
                        , @Giorni INT
SELECT @strCorpo =
         dbo.fn_CreaCorpoMail( IDAttività
                                             , ISNULL(Attività,'''')
                                             ,ISNULL(Descrizione,'''')
                --                             ,ISNULL(CAST(DataInizio AS
VARCHAR),'''')
                --                            ,ISNULL(CAST(DataFine AS
VARCHAR),''''),ISNULL
                --    Qui ad esempio perchè fai la cast di due valori che
sono già varchar??
                                             ,ISNULL(DataInizio,'''')
                                            ,ISNULL(DataFine,'''')
,ISNULL(ResponsabileEvento,''''))
                                            ,@DataPreavviso => DataPreavviso
                                            ,@DataInizio =DataInizio
                                            ,@DataFine => DataFine
                                            ,@strMailAtt = > EmailAttività
                                            , @strMailEve = EmailEvento
                                            , @intIDRuolo = IDRuolo
                                            ,@intPreavvisoRespAtt =
PreavvisoRespAtt
                                            , @intPreavvisoRespEve =>
PreavvisoRespEve
                                            , @intPreavvisoAmministratore =>
PreavvisoAmministratore
,@intScadenzaRespAtt = ScadenzaRespAtt
                                            ,@intScadenzaRespEve =>
ScadenzaRespEve
,@intScadenzaAmministratore = ScadenzaAmministratore
                                            ,@intScadenzaCapoArea =
ScadenzaCapoArea
                                            ,@intAmministratoreAttività =
AmministratoreAttività
                                            ,@intAmministratoreEvento =
AmministratoreEvento
                   FROM view_DatiMail_NEW
 PRINT  @strCorpo
EXEC (@strCorpo)
GO
Ci sono diverse cose che non quadrano ne a me ne al mio sql server.
Primo il gran casino di variabili dichiarate e va be ... se le sfoltisci
forse
gli piace di più, ma il problema non è certo quello.
Come pretendi di fare ,@DataPreavviso => DataPreavviso o come tutte
le righe sotto?
Quella che tu stai facendo è una chiamata ad una stored procedure che
deve ricevere come argomento delle variabili. Non può certo mettersi a
fare dei confronti. E' impensabile. E detto fra noi, visto che devi passare
delle variabili, di tutte quelle declare non ne hai più bisogno.
E poi come ti ho commentato nel codice, perchè fai la cast di due valori
che sono già varchar??
Ma l'hai già compilata la sp o la stavi solo scrivendo? Perchè se sei
riuscito a compilarla o sono io che mi sono bevuto il cervello e idem
il mio sql server appena reinstallato o è il tuo che ha seri problemi
esistenziali.
Andrea

 esistenziali.
Il punto è che se provo solo a stamparla non ho problemi, ma io ho
l'esigenza di eseguirla ed è qua che genera gli errori che ho scritto nel
primo post.


 nel primo post.
Non capisco cosa intendi per stamparla. Comunque gli errori sono
dati da malformazioni sintattiche.
Ciao
Andrea

Scusate se mi intrometto, magari dico una stupidata ma:
exec riceve come parametro una stringa; esempio:
declare @miastringa varchar(4000);
set @miastringa="select * from miatabella";
exec @miastringa;
La sp creata è un po' strana: esegue un "vero" select assegnando il
risultato a una variabile, e poi esegue la variabile stessa...
E' quantomeno un po' strana; l'errore secondo me si ha rieseguendo il
risultato ottenuto; dovresti quindi postare il print @tuavar per capire cosa
ha restituito e cosa sta eseguendo.
Tieni anche conto, a margine, che usando exec si perdono i vantaggi delle sp
in quanto viene ricompilata in tempo reale ogni volta.

 di output. L'importante è che ci sia almeno un parametro.
Piccola correzione. Volevo scrivere una cosa ma ne ho scritta
un altra. Comuqne si puoi anche creare sp senza parametri.
Per concludure con il tuo aiuto ... se devi mandare e-mail
perchè il tuo esempio mi ricorda qualcosa sul BOL, prova
a dare un occhio alla SP per mandare e-mail ... perchè la
tua struttura è simile a quella.
E guarda bene cosa si aspettano le tue procedure e soprattutto
cosa ti restituiscono. Perchè facile che chiedi a sql di selezionare
qualche cosa che il realtà non può perchè non ha parametri di
ritorno o roba simile. Senza tutto il pappaderllone è diffile
stare dietro ... ma adesso devo lavorare anche io.
Spero di esserti stato d'aiuto.

[Cristiano Larghi] ha scritto:


Il Print @strCorpo è il seguente:
Stesura programma
Data Inizio Attività: ago  6 2003  9:00AM
Data Fine Attività: ago  7 2003 12:00AM
Responsabile Attività: Rossi Mario
Responsabile Evento: Bianchi Luca
ed è esatto! 
Il mio problema è riuscire ad ottenere questo risultato in una txt in
visual basic, ho pensato quindi di usare exec @strCorpo per associare il
risultato della SP a un recordset, se lascio print in vb genera un errore
di run-time '3704'
operation is not allowed when the object is closed.
Non so cosa e come devo fare.
Grazie cmq!


[Andrea Moro] ha scritto:





Per ora non devo spedire email, ma dovrei riuscire ad associare a un
recordset in VB, il risultato della sp. 
Cmq Grazie Mille per l'aiuto!!!


 ed è esatto!
???
Quello che stai facendo è: esegui il risultato => lui sta eseguendo la query
sopra indicata...per forza segnala errore, che razza di query è???
Non ti basta eseguire un normale select e costruire il risultato da vb
leggendo i valori?
Scusami ma non riesco proprio a capire perché stai facendo tutto questo giro
stranissimo...hai una select? Ti restituisce dei dati? Usa quelli...

 stranissimo...hai una select? Ti restituisce dei dati? Usa quelli...
Io invece quello che non capisco è che ho sempre creato una SP ed eseguito
la variabile che conteneva il suo output, ma adesso non ci riesco e non
capisco perchè genera errore.


E allora niente di piů semplice. Crei una stored procedure
che restituisce un oggetto table.
Oppure se devi fare una composizione di una stringa
(da come credo di aver capito) puoi anche fare
select @tuastringa (select ....
-- 
Saluti
Andrea Moro

beh, io non capisco bene cosa sta facendo, ma se deve solo costruire una
stringa può sommare i valori:
select campo1+" "+campo2+" "+campo3 as miastringa from.....
Oppure, come dici te, una function table...
Oppure può usare un cursor nella sp per ciclare i dati e accodare il
risultato in una variabile (nel books online c'è un buon esempio su questa
tecnica, se non ricordo male)...

 select @tuastringa (select ....
Già, ho usato select, creando un'unica stringa e  sembra funzionare, per
ora lo lascio così....
Grazie ancora!
Ciao!


[Cristiano Larghi] ha scritto:

Ho creato una stringa, come nel mio ultimo 3D di risposta ad Andrea Moro,
sembra funzionare... ora però cerco di vedere altre soluzioni...
Grazie....
Ciao!!
