Visualizzazione dei risultati da 1 a 7 su 7
  1. #1

    [SQL SERVER 2008R2] Cursore

    Buongiorno a tutti, avrei bisogno di un aiuto per risolvere la seguente problematica:

    avrei necessità di evitare di inserire n volte il numero di matricola per la quale una procedura dovrebbe girare. Ho una variabile di questo tipo

    codice:
    declare @matricola varchar(10)
    set@matricola='1522'

    come faccio a far si che la procedura che ho scritto venga eseguita per ogni singola matricola risultante da una select o inserita in un'altra variabile?

    Se serve posso postare la procedura.

    Grazie in anticipo per l'aiuto
    IncorrectSyntax

  2. #2

  3. #3
    eccola:

    codice:
    ------ recuperato con dts MA_DATE dal dbdwhpag del bs114 
    --
     
    --select * FROM ma_date
    
    
    
    
    DECLARE @matricola varchar(10)
    DECLARE @inizio		date
    DECLARE @fine		date
    
    
    DECLARE  @gg_ciclo	int
    		,@gg2		int
    		,@cicli		int
    
    
    SET @fine		= '2017-08-31'
    SET @matricola	--= '0000035539'
    				--= '0000035538'
    				--= '0000035642'
    				= '0000040852'
    --
    -----
    --
    TRUNCATE TABLE	WWW_TURNAZIONE_MATRICOLA
    INSERT INTO		WWW_TURNAZIONE_MATRICOLA
    SELECT	 dipen.azienda,dipen.matricola
    
    
    		,dipen_turnazioni.turnazione
    		,dipen_turnazioni.posizione					posizione_START
    		,dipen_turnazioni.inizio,dipen_turnazioni.fine
    		,turnazioni.giorni,turnazioni.scorrimento
    
    
    		,turnazioni_cicli.posizione,turnazioni_cicli.causale,turnazioni_cicli.or_fisso
    		,orari.orlav
    
    
    		,ORDINE1 = CASE 
    				WHEN turnazioni_cicli.posizione = dipen_turnazioni.posizione   THEN 1000 
    				WHEN turnazioni_cicli.posizione	> dipen_turnazioni.posizione   THEN 2000 + turnazioni_cicli.posizione
    				WHEN turnazioni_cicli.posizione	< dipen_turnazioni.posizione   THEN 3000 + turnazioni_cicli.posizione
    		
    		ELSE 0 
    		
    		END 
    
    
    FROM		dipen					
    
    
    INNER JOIN		dipen_turnazioni	on (		dipen.azienda	= dipen_turnazioni.azienda
    										AND	dipen.matricola = dipen_turnazioni.matricola )
    INNER JOIN		turnazioni			on (		dipen_turnazioni.azienda	= turnazioni.azienda
    										AND	dipen_turnazioni.turnazione = turnazioni.turnazione )
    
    
    INNER JOIN		turnazioni_cicli		on (		turnazioni.azienda		= turnazioni_cicli.azienda
    										and turnazioni.turnazione	= turnazioni_cicli.turnazione)
    
    
    LEFT OUTER JOIN orari				on (		turnazioni_cicli.azienda		= orari.azienda
    											and turnazioni_cicli.or_fisso		= orari.orario)
    
    
    WHERE	dipen.matricola								= @matricola
    AND		ISNULL(dipen_turnazioni.fine,'2099-12-31')	>= GETDATE()
    ORDER BY  ORDINE1  ,turnazioni_cicli.posizione 
    
    
    
    
    --
    ------
    --
    
    
    TRUNCATE TABLE	WWW_SVILUPPO_MATRICOLA
    INSERT INTO		WWW_SVILUPPO_MATRICOLA
    SELECT MA_DATE.DATA,WWW.*
    FROM (SELECT DISTINCT azienda,matricola, turnazione,inizio,fine  FROM WWW_TURNAZIONE_MATRICOLA) WWW
    INNER JOIN   MA_DATE  ON (MA_DATE.DATA between  WWW.inizio and @fine )
    ORDER BY MA_DATE.DATA
    
    
    --
    -----
    --
    
    
    
    
    SELECT @gg_ciclo = count(*)  FROM WWW_TURNAZIONE_MATRICOLA
    
    
    
    
    print 'Turnazione su gg '
    print @gg_ciclo
    print ' '
    
    
    
    
    
    
    SELECT @gg2 = cOunt(*)FROM WWW_SVILUPPO_MATRICOLA
    print  'Giorni di sviluppo :'
    print	 @gg2
    print ' '
    SET		@cicli = (@gg2 / @gg_ciclo)
    				+1
    print	'Turnazione nei gg di sviluppo:'
    print @cicli
    print ' '
    
    
    SELECT   @gg_ciclo GG_CICLO ,@gg2 GG2,@cicli CICLI
    
    
    --
    ---===========================================================================================================
    --
    
    
    DECLARE @INDICE_CICLO INT
    
    
    
    
    DECLARE CUR_CICLI
    CURSOR FOR 
    
    
    SELECT 
     INDICE
     FROM WWW_SVILUPPO_MATRICOLA
     WHERE INDICE <=  @CICLI  -- 79 --
    
    
    
    
    TRUNCATE TABLE WWW_RISULTA
    --
    -----
    --
    
    
    OPEN CUR_CICLI
    
    
    FETCH NEXT
    FROM CUR_CICLI
    INTO @INDICE_CICLO
    
    
    
    
    
    
    WHILE @@FETCH_STATUS = 0
    
    
    
    
    BEGIN
    INSERT INTO WWW_RISULTA
    SELECT --TOP @gg_ciclo    --7 --
    SVI.*,TUR.causale,TUR.or_fisso,TUR.orlav,TUR.ORDINE1
    
    
    
    
    FROM		WWW_SVILUPPO_MATRICOLA		SVI
    INNER JOIN	WWW_TURNAZIONE_MATRICOLA	TUR ON (SVI.INDICE -((@INDICE_CICLO
    																-1) *  @gg_ciclo )--7 --
    														 = TUR.INDICE)
    WHERE SVI.INDICE > (SELECT ISNULL(MAX(INDICE ),0) FROM WWW_RISULTA)
    
    
    ORDER BY SVI.INDICE
    
    
    
    
    FETCH NEXT
    FROM CUR_CICLI
    INTO @INDICE_CICLO
    
    
    END
    
    
    CLOSE CUR_CICLI
    DEALLOCATE CUR_CICLI
    IncorrectSyntax

  4. #4
    Nessuno ha consigli?
    IncorrectSyntax

  5. #5
    scusa ma non avevo capito bene la richiesta.

    io di solito invece di usare un cursore, faccio così
    1. seleziono tutte le chiavi da trattare (in questo caso matricole) in una tabella temporanea
    2. nella tabella temporanea c'è anche un id progressivo
    3. faccio un ciclo do.while finché ci sono record nella tabella temporanea
    4. dalla temp, estraggo il primo record (TOP 1)
    5. richiamo la procedura che mi serve passando la chiave estratta
    6. all'uscita cancello l'id dalla temp e torno a 3
    7. fatto!

  6. #6
    Scusa l'ignoranza ma non conosco i cicli do.while; hai tempo di farmi un esempio che possa applicare alla mia necessit�?

    Grazie.
    IncorrectSyntax

  7. #7
    SELECT [name] INTO tmpTable FROM sys.tables
    ALTER TABLE dbo.tmpTable ADD
    myID int NOT NULL IDENTITY (1, 1)
    GO
    ALTER TABLE dbo.tmpTable SET (LOCK_ESCALATION = TABLE)


    DECLARE @myID AS INT
    WHILE (SELECT COUNT(*) FROM tmpTable)>0
    BEGIN
    SELECT TOP 1 @myID=myID FROM tmpTable ORDER BY myID
    SELECT * FROM tmpTable WHERE myID=@myID
    PRINT @myID
    -- qui richiama la tua procedura
    DELETE FROM tmpTable WHERE myID=@myID
    END


    DROP TABLE tmpTable

  8. #8
    Ora ci provo.

    Grazie mille.

    Ciao.
    IncorrectSyntax

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.