Pagina 1 di 3 1 2 3 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 25
  1. #1

    [SQLServer] Uso dei cursori in una stored procedure

    quella che segue è una stored procedure che deve riempire una tabella temporanea con dei dati
    che dovrò poi stampare.

    In questa stored ho 2 problemi:
    1. la variabile @mioFiltro viene passata alla stored da vb e fin qui tutto ok. il problema mi si pone
    nel momento in cui vado ad eseguire la select per riempire il cursore: non riesco a passare
    alla clausola WHERE la mia variabile.

    2. una volta dichiarato il cursore, la select che segue
    presumo riempia il cursore stesso con il risultato della select
    stessa, quindi con l'istruzione OPEN mioCursore io apro un cursore
    già pieno. Come faccio a leggere i campi del cursore? con i recordset
    si usa scrivere ad esempio mioRS("TitoloPostale"), ma qui come faccio?

    codice:
    CREATE PROCEDURE sp_CreaElencoPerStampaBuste
      @mioFiltro varchar(100)
    AS
    SET @mioFiltro = @mioFiltro + ' AND indIndirizzo > 0' 
    
    /* riempio il cursore con il risultato della select sulla 
       tbnominativi*/
    DECLARE @TitoloPostale varchar(10), @Nominativo varchar(100), 
            @IndirizzoCompleto varchar(200)
    DECLARE @miaCittà varchar(20), @miaProvincia varchar(3), 
            @mioStato varchar(20)
    
    DECLARE mioCursore CURSOR FOR
    
        SELECT IDNominativo, TitoloPostale, Titolo, 
         LTRIM(RTRIM(ISNULL(Cognome,' ') + ' ' + ISNULL(Nome,' ') 
         + ' ' + ISNULL(Posizione,' '))) AS Nominativo,
         IDSocietà, Indirizzo1, Cap1, IDCittà1, IDProvincia1, 
         IDStato1, Indirizzo2, Cap2, IDCittà2, IDProvincia2, 
         IDStato2, indIndirizzo
        FROM TBNominativi INNER JOIN 
         TBTitoli ON 
         TBNominativi.IDTitolo = TBTitoli.IDTitolo INNER JOIN 
         TBTitoliPostali ON 
         TBNominativi.IDTitoloPostale = 
                      TBTitoliPostali.IDTitoloPostale 
        WHERE + ' ' + @mioFiltro
    
        OPEN mioCursore
    
        FETCH NEXT FROM mioCursore
    
        WHILE @@FETCH_STATUS = 0
    	
    	BEGIN
    /*Eseguo la select su indIndirizzo per sapere quale indirizzo 
      devo utilizzare nella stampa*/
    	SET @TitoloPostale = mioCursore('TitoloPostale')
    	SET @Nominativo = LTRIM(RTRIM(mioCursore('Titolo')
                + ' ' + mioCursore('Nominativo')))
    		
    	if mioCursore('indIndirizzo') = 1
    	   BEGIN
                 Select @miaCittà = Città FROM TBCittà
                   WHERE IDCittà = mioCursore('IDCittà1')
                 Select @miaProvincia = Provincia FROM TBProvincie
                   WHERE IDProvincia = mioCursore('IDProvincia1')
    	     Select @mioStato = Stato FROM TBStati 
                   WHERE IDStato = mioCursore('IDStato1')
    	     SET @IndirizzoCompleto = mioCursore('Indirizzo1') +
                   Char(13) + mioCursore('Cap1')
    	   END
    
    	else if mioCursore.Field('indIndirizzo') = 2
    	   BEGIN
                 Select @miaCittà = Città FROM TBCittà 
                   WHERE IDCittà = mioCursore('IDCittà1')
    	     Select @miaProvincia = Provincia FROM TBProvincie 
                   WHERE IDProvincia = mioCursore('IDProvincia2')
    	     Select @mioStato = Stato FROM TBStati 
                   WHERE IDStato = mioCursore('IDStato2')
    	     SET @IndirizzoCompleto = mioCursore('Indirizzo2')
    	   END			      
    			
    	SET @IndirizzoCompleto = @IndirizzoCompleto + Char(13) +
                @miaCittà + '(' + @miaProvincia + ')'
    	if UPPER(@mioStato) <> 'ITALIA'  SET @IndirizzoCompleto = 
                     @IndirizzoCompleto + Char(13) + @mioStato
    
    -- Inserisco i risultati nella tabella TBIndirizzoPostali
    
             INSERT TBIndirizziPostali
                     (TitoloPostale,Nominativo,IndirizzoCompleto) 
    	   VALUES
                     (@TitoloPostale,@Nominativo,@IndirizzoCompleto)
    
            FETCH NEXT FROM mioCursore	
    
         END
    
    CLOSE mioCursore
    DEALLOCATE mioCursore
    
    GO

    05.08.2005 - by alka
    Auguri all'angelo custode dei moderatori.

  2. #2
    Utente di HTML.it L'avatar di darkblOOd
    Registrato dal
    Jul 2001
    Messaggi
    2,212

    Re: [SQLServer] Uso dei cursori in una stored procedure

    Originariamente inviato da ladyBlu
    1. la variabile @mioFiltro viene passata alla stored da vb e fin qui tutto ok. il problema mi si pone
    nel momento in cui vado ad eseguire la select per riempire il cursore: non riesco a passare
    alla clausola WHERE la mia variabile.
    fammi capire una cosa, come cavolo viene la WHERE se imposti il filtro così:
    codice:
    SET @mioFiltro = @mioFiltro + ' AND indIndirizzo > 0'
    e poi usi questo codice:
    codice:
    WHERE + ' ' + @mioFiltro
    la sintassi della WHERE è:
    WHERE NomeCampo OPERATORE Valore
    ora bisogna vedere cosa passi come filtro

    2. una volta dichiarato il cursore, la select che segue
    presumo riempia il cursore stesso con il risultato della select
    stessa, quindi con l'istruzione OPEN mioCursore io apro un cursore
    già pieno. Come faccio a leggere i campi del cursore? con i recordset
    si usa scrivere ad esempio mioRS("TitoloPostale"), ma qui come faccio?
    con il punto?

    Cursore.NomeCampo?

  3. #3

    Re: Re: [SQLServer] Uso dei cursori in una stored procedure

    Originariamente inviato da darkblOOd
    fammi capire una cosa, come cavolo viene la WHERE se imposti il filtro così:
    codice:
    SET @mioFiltro = @mioFiltro + ' AND indIndirizzo > 0'
    e poi usi questo codice:
    codice:
    WHERE + ' ' + @mioFiltro
    la sintassi della WHERE è:
    WHERE NomeCampo OPERATORE Valore
    ora bisogna vedere cosa passi come filtro
    @mioFiltro ha un valore che gli viene passato dal prg quando l'utente clicca sul pulsante Stampa...
    questo valore è una stringa, ad esempio "IDSettore = 3". quindi, dal momento che per la where mi serve un filtro completo dell'indice dell'indirizzo da usare, devo settare @mioFiltro così come ho fatto io.
    alla fine devo ottenere:
    @mioFiltro = 'IDSettore = 3 AND AND indIndirizzo > 0'

    e così come ho scritto io è giusto, no?!...:master:
    con il punto?

    Cursore.NomeCampo?
    li ho provati entrambi, ma non gli piace.

    05.08.2005 - by alka
    Auguri all'angelo custode dei moderatori.

  4. #4
    Utente di HTML.it L'avatar di darkblOOd
    Registrato dal
    Jul 2001
    Messaggi
    2,212
    personalmente non lavorerei sul parametro....ma farei

    WHERE @parametro &" AND ....."

    e poi sta attenta agli apici singoli

    per il resto nin zo, posso provare a dare un'occhiata

  5. #5
    Originariamente inviato da darkblOOd
    personalmente non lavorerei sul parametro....ma farei

    WHERE @parametro &" AND ....."

    e poi sta attenta agli apici singoli

    per il resto nin zo, posso provare a dare un'occhiata
    dark, sono su SQLServer e qui non si usano apici doppi, ma solo singoli. per questo il filtro diventa:
    'IDSettore = 3 AND AND indIndirizzo > 0'

    e per concatenare le stringhe non si usa l'operatore & ma il simbolo +
    quindi, semmai ciò che hai detto tu diventa:
    WHERE @parametro + ' AND .....'

    ma cosa sarebbe sto @parametro? :master:

    05.08.2005 - by alka
    Auguri all'angelo custode dei moderatori.

  6. #6
    Utente di HTML.it L'avatar di darkblOOd
    Registrato dal
    Jul 2001
    Messaggi
    2,212
    Originariamente inviato da ladyBlu
    dark, sono su SQLServer e qui non si usano apici doppi, ma solo singoli. per questo il filtro diventa:
    'IDSettore = 3 AND AND indIndirizzo > 0'

    e per concatenare le stringhe non si usa l'operatore & ma il simbolo +
    quindi, semmai ciò che hai detto tu diventa:
    WHERE @parametro + ' AND .....'

    ma cosa sarebbe sto @parametro? :master:
    il tuo @filtro, fagiana

  7. #7
    Originariamente inviato da darkblOOd
    il tuo @filtro, fagiana
    ...ok, allora lo avevo capito, ma mi spieghi che cosa cambia ad usare @mioFiltro o @parametro? se sono la stessa cosa perchè non hai usato lo stesso nome?...fagiano ci sarai...



    cmq, ho provato anche come hai detto tu
    WHERE @mioFiltro + ' And IndirizzoPerAuguri > 0'

    ma mi genera errore, non capisco il perchè ma è così.

    05.08.2005 - by alka
    Auguri all'angelo custode dei moderatori.

  8. #8
    Utente di HTML.it L'avatar di darkblOOd
    Registrato dal
    Jul 2001
    Messaggi
    2,212
    Originariamente inviato da ladyBlu
    ...ok, allora lo avevo capito, ma mi spieghi che cosa cambia ad usare @mioFiltro o @parametro? se sono la stessa cosa perchè non hai usato lo stesso nome?...fagiano ci sarai...



    cmq, ho provato anche come hai detto tu
    WHERE @mioFiltro + ' And IndirizzoPerAuguri > 0'

    ma mi genera errore, non capisco il perchè ma è così.
    ceh dici, cominciamo a parlare da programmatori?

    che errore ti da?

  9. #9
    Utente di HTML.it L'avatar di vonkranz
    Registrato dal
    Sep 2001
    Messaggi
    1,387
    Hai provato con

    Cursore!NomeCampo

    ...non ho letto tutto il 3D...abbi pazienza...
    ...and I miss you...like the deserts miss the rain...

  10. #10
    Utente di HTML.it L'avatar di darkblOOd
    Registrato dal
    Jul 2001
    Messaggi
    2,212
    toh :tongue:
    Utilizzo dell'istruzione FETCH per archiviare valori nelle variabili
    Questo esempio è simile al precedente, con la sola differenza che il risultato delle istruzioni FETCH viene archiviato in variabili locali anziché essere restituito direttamente al client. L'istruzione PRINT combina le variabili in un'unica stringa e le restituisce al client.

    codice:
    USE pubs
    GO
    
    -- Declare the variables to store the values returned by FETCH.
    DECLARE @au_lname varchar(40), @au_fname varchar(20)
    
    
    DECLARE authors_cursor CURSOR FOR
    SELECT au_lname, au_fname FROM authors
    WHERE au_lname LIKE "B%"
    ORDER BY au_lname, au_fname
    
    OPEN authors_cursor
    
    -- Perform the first fetch and store the values in variables.
    -- Note: The variables are in the same order as the columns
    -- in the SELECT statement. 
    
    FETCH NEXT FROM authors_cursor
    INTO @au_lname, @au_fname
    
    -- Check @@FETCH_STATUS to see if there are any more rows to fetch.
    WHILE @@FETCH_STATUS = 0
    BEGIN
    
       -- Concatenate and display the current values in the variables.
       PRINT "Author: " + @au_fname + " " +  @au_lname
    
       -- This is executed as long as the previous fetch succeeds.
       FETCH NEXT FROM authors_cursor
       INTO @au_lname, @au_fname
    END
    
    CLOSE authors_cursor
    DEALLOCATE authors_cursor
    GO

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.