• User Attivo

    [SQL] Stored procedure chiamata da ASP

    Buongiorno ragazzi,
    ho un problema non indifferente con Sql Server, ovvero richiamando da una pagina ASP una stored procedure non esegue correttamente la procedura, pare che ne esegua solo un pezzo, mentre se prendo l'Sql inserito nella stored procedura e lo eseguo nel Query Analyzer va tutto perfettamente.
    Secondo voi cosa potrebbe essere, ci sto sbattendo la testa da 2 giorni... bo!!
    Confido in Voi, attendo Vostre pronte notizie in merito.

    grazie anticipatamente
    ciao


  • User Attivo

    Qualche parametro passato in modo errato?
    Senza vedere il codice direi che può indovinare solo un mago 😄


  • User Attivo

    Non vengono passati parametri alla stored procedure, nella pagina ASP chiamao semplicemente la procedura senza alcun parametro.
    Se ti potrebbe essere di aiuto ti posso inviare il codice SQL... dimmi tu!!

    fammi sapere

    grazie
    ciao


  • User Attivo

    Postalo qui l'sql...
    Ora che ci penso potrebbe essere il timeout della pagina. Richiede un lungo tempo di esecuzione?
    Sembra l'unica ipotesi...


  • User Attivo

    Forse hai ragione per il timeout...

    
    CREATE PROCEDURE Sp_IMPORT_RM5_Operatore_No_Su_Giro
    
    --Questa procedura viene utlizzata per importare i fattorini che non sono stati assegnati ad alcun viaggio
    --per qualsiasi tipo di motivazione (Ferie, Permesso, Malattia e Training).
    --Viene richiamata da una pagina ASP che a sua volta viene chiamata tramite un .BAT che viene a sua volta
    --richiamato da un pulsantino in Access
    
    
    AS
    
    BEGIN
    
    	set nocount on
    
    	--cancello contenuto della tabella TB_GIRO_RDS a seconda della data che mi  stata passata
    
    	DECLARE @DataRDS datetime
    
    	DECLARE CursorInsertTable1 CURSOR FOR
    	SELECT DISTINCT
    	DataViaggio
    	FROM RM5.dbo.ViaggiEsportatiFleming
    	GROUP BY DataViaggio
    	OPEN CursorInsertTable1
    	FETCH NEXT FROM CursorInsertTable1 INTO @DataRDS
    	WHILE @@FETCH_STATUS = 0
    	   begin
    			
    		DELETE FROM TB_GIRO_RDS WHERE DATA = @DataRDS
    	
    	      FETCH NEXT FROM CursorInsertTable1 INTO @DataRDS
    	
    	   end 	
    	
    	close CursorInsertTable1
    	deallocate CursorInsertTable1
    
    
    	
    	--inserimento nella tabella TB_GIRO_RDS
    
    	DECLARE
    	@UtenteId varchar(10),
    	@Data datetime,
    	@NewId int, -- Nuovo ID
    	@Tabella varchar(50)
    	
    	SET @Tabella = 'TB_UTENTE_NO_SU_GIRO'
    	
    	DECLARE CursorInsertTable CURSOR FOR
    	SELECT DISTINCT
    	DB_COLLABORATORI.dbo.AD_UTENTI.ID, 
    	RM5.dbo.Problemi.Data
    	FROM
    	DB_COLLABORATORI.dbo.AD_UTENTI, RM5.dbo.Problemi 
    	WHERE EXISTS (SELECT RM5.dbo.ViaggiEsportatiFleming.CodProblema FROM RM5.dbo.ViaggiEsportatiFleming WHERE RM5.dbo.ViaggiEsportatiFleming.CodProblema = RM5.dbo.Problemi.Codice)
    	AND (DB_COLLABORATORI.dbo.AD_UTENTI.AREA_ID = 'S00000000J') 
    	AND (DB_COLLABORATORI.dbo.AD_UTENTI.STATO = '1')
    	AND (DB_COLLABORATORI.dbo.AD_UTENTI.ID+Convert(char(10),RM5.dbo.Problemi.Data)) NOT IN
    		(
    		SELECT DISTINCT
    		(RM5.dbo.ViaggiEsportatiFleming.CodAutista+Convert(char(10),RM5.dbo.ViaggiEsportatiFleming.DataViaggio))
    		FROM RM5.dbo.ViaggiEsportatiFleming
    		GROUP BY RM5.dbo.ViaggiEsportatiFleming.CodAutista, RM5.dbo.ViaggiEsportatiFleming.DataViaggio
    		)	    
    	OPEN CursorInsertTable
    	FETCH NEXT FROM CursorInsertTable INTO @UtenteId, @Data
    	WHILE @@FETCH_STATUS = 0
    	   begin
    			
    		EXEC MAKE_UNIQUE_KEY_INT @Tabella, @NewId OUTPUT -- Creo la nuova chiave primaria
    	
    		INSERT INTO TB_UTENTE_NO_SU_GIRO
    		(
    		ID,
    		UTENTE_ID,
    		DATA
    		)
    		VALUES
    		(
    		@NewId,
    		@UtenteId, 
    		@Data
    		)
    	
    	
    	      FETCH NEXT FROM CursorInsertTable INTO @UtenteId, @Data
    	
    	   end 	
    	
    	close CursorInsertTable
    	deallocate CursorInsertTable
    
    END
    
    

    confido in te
    grazie
    ciao


  • User Attivo

    Sicuramente va in timeout da codice...
    La procedura non è proprio semplicissima come esecuzione, fa anche uso di cursori e se i record sono centinaia di migliaia di sicuro non è veloce. Guarda il tempo che ci mette da query analyzer. Li la esegue perchè non esiste timeout. Può impiegarci anche 5 giorni.
    Le cose sono 2. O provi ad ottimizzarla (usa gli indici sui campi where) o la esegui solo da analyzer.
    Se il tempo di esecuzione non è esagerato puoi alzarlo un po via codice.

    server.scriptTimeout=n_secondi (in asp classic)
    Page.Server.ScriptTimeout = 60 (in vb.net)


  • User Attivo

    Non è il timeout ci mette 4 secondi ad eseguire entrambe le procedure...
    Il server però ha molte richieste al giorno, tieni conto che ci sono 150 utenti che lo usano costantemente e fanno decine di richieste al minuto, infatti pare proprio che quando le richieste aumentano vengono inseriti meno record nella tabella e viceversa quando le richieste diminuiscono vengono inseriti + record nella mia tabella.
    Che posso fare!?!?!?
    Come posso dire alla stored procedure "ESEGUI IL MIO CODICE FINO IN FONDO PRIMA DI USCIRE..." !?!?!?

    fammi sapere

    grazie
    ciao


  • User Attivo

    Forse è una questione di permessi

    Sul query analyzer ti logghi come sa? Prova a loggarti con lo stesso utente col quale ti connetti al database e vedi se ti esegue tutta la procedura


  • User Attivo

    Uso lo stesso utente da ambo le parti...
    Sembra quasi che mi serva un ROLLBACK o qualche cosa del genere... che ne dite!?!?

    grazie
    ciao


  • Moderatore

  • User Attivo

    A sto punto non saprei. E' un po difficile capire senza metterci le mani sopra.
    i sintomi sono quelli del timeout ma se mi dici che la stored è veloce non saprei.
    Magari è il webserver che è troppo lento a causa delle troppe connessioni


  • User Attivo

    Pensate ho provato il ROLLBACK e non inserisce nulla nella tabella
    Di seguito il codice che ho inserito come rollback

    
    --al'inizio della procedura ho messo
    BEGIN TRAN 
    
    
    --mentre alla fine della procedura ho messo
    IF (@@ERROR<>0) GOTO on_error
    
    COMMIT TRAN
    RETURN (1)
    
    on_error:
    ROLLBACK TRAN
    RETURN (-1)
    
    

    che dite dovrebbe essere giusto!?
    non so + che fare... qualche suggerimento!?!?!?!?!?!?!?!?

    grazie
    ciao


  • User Attivo

    Io sono convinto che non è un problema di database ma dipende sicuro da qualcosa che sta a monte...
    Se la stored funziona nell'analizyer allora il db non c'entra sicuro.


  • User Attivo

    Cosa mi consigli di guardare!?
    fammi sapere

    grazie
    ciao


  • User Attivo

    Crea una tabella di prova con 1 campo testo.
    Crea una nuova stored che accetti un parametro nvarchar in ingresso e che inserisca il valore nella nuova tabella creata.
    Chiama la stored passandogli il parametro e vedi se inserisce il valore.
    Comincia ad escludere almeno se c'è un problema di comunicazione con il database o se è quella stored a non rispondere.


  • User Attivo

    @FuSioNmAn said:

    Crea una tabella di prova con 1 campo testo.
    Crea una nuova stored che accetti un parametro nvarchar in ingresso e che inserisca il valore nella nuova tabella creata.
    Chiama la stored passandogli il parametro e vedi se inserisce il valore.
    Comincia ad escludere almeno se c'è un problema di comunicazione con il database o se è quella stored a non rispondere.

    Questo lo fa... anche perchè comunque ci sono centinaia di richieste al giorno... sembra che sia solo quando deve inserire un certo numero di dati in 2 tabelle diverse tramite un ciclo sql...
    Comunque abbiamo escluso che sia problema di comunicabilità, cos'altro posso fare!?
    confido in te, grazie
    ciao


  • User Attivo

    Incolla il codice asp della pagina che chiama la stored.
    Tutto il codice asp, non solo dove chiama la stored.


  • User Attivo

    @FuSioNmAn said:

    Incolla il codice asp della pagina che chiama la stored.
    Tutto il codice asp, non solo dove chiama la stored.

    Ecco il codice ASP che mi hai chiesto

    
    <%@ Language=VBScript %>
    <% Response.buffer = true %>
    <html>
    <!-- #INCLUDE FILE="Constants.asp" -->
    <head>
    <link rel="STYLESHEET" type="text/css" href="StyleSheets/styleStampa.css">
    <meta NAME="GENERATOR" Content="Microsoft Visual Studio 6.0">
    
    <meta HTTP-EQUIV="Cache-Control" CONTENT="no_cache">
    <meta HTTP-EQUIV="Pragma" CONTENT="no_cache">
    <meta HTTP-EQUIV="Expires" CONTENT="0">
    
    <script language="javascript" src="js/Utility.js"></script>
    
    </head>
    
    <body>
    
    <%
    
    dim conn
    dim rsImportViaggi
    dim rsImportOperatoriNoSuGiro
    
    Response.expires=0
    Response.CacheControl="private"
    
    Server.ScriptTimeout = 2000
    
    set conn = server.CreateObject("ADODB.Connection")
    conn.Open Session("Connessione")
    
    set rsImportViaggi = server.CreateObject ("ADODB.recordset")
    set rsImportViaggi = conn.Execute ("Sp_IMPORT_RM5_Viaggi_Rds")
    %>
    
    <br><br><br><br>
    <center>
    IMPORT VIAGGI R.D.S. NEL PORTALE<br>AVVENUTO CON SUCCESSO...
    </center>
    
    <%
    set rsImportOperatoriNoSuGiro = server.CreateObject ("ADODB.recordset")
    set rsImportOperatoriNoSuGiro = conn.Execute ("Sp_IMPORT_RM5_Operatore_No_Su_Giro")
    %>
    
    <br><br><br><br>
    <center>
    IMPORT OPERATORI NO SU GIRO NEL PORTALE<br>AVVENUTO CON SUCCESSO...
    </center>
    
    
    <%
    'Chiude rs e conn
    rsImportViaggi.close
    set rsImportViaggi = nothing
    
    rsImportOperatoriNoSuGiro.close
    set rsImportOperatoriNoSuGiro = nothing
    
    conn.Close
    set conn = nothing
    %>
    
    </body>
    </html>
    
    
    

    ciao, ciao


  • User Attivo

    Avanti ragazzi, ma proprio + nessuno mi sa aiutare...!?
    dai forza e coraggio a me è rimasto il problema inrisolto... non vorrete lasciare un povero ragazzo in alto mare!!

    AIUTO!!

    grazie
    ciao