none
Cursor dentro de Cursor RRS feed

  • Pergunta

  • Boa tarde,

     

    Desenvolvi um query para poder utilizar capturar um trecho de registros e duplica-los dentro da mesma tabela. Gostaria de saber se a forma que utilizei o cursor esta correta.

    Declare @Filial varchar(2)
    Declare @Grupo varchar(2)
    Declare @Depto varchar(14)
    Declare @Descric varchar(30)
    Declare @CC varchar(9)
    Declare @Regiao varchar(6)
    Declare @Filresp varchar(2)
    Declare @Matresp varchar(6)
    Declare @Depsup varchar(9)
    Declare @Delet varchar(1)
    Declare @Recno int
    
    Declare @Filial_dest varchar(2)
    
    --@Historico,@Filial,@Grupo,@Depto,@Descric,@CC ,@Regiao,@Filresp,@Matresp,@Depsup,@Delet ,@Recno 
    
    
    Declare MyCursor cursor for 
          select QB_FILIAL,QB_GRUPO,QB_DEPTO,QB_DESCRIC,QB_CC,QB_REGIAO,QB_FILRESP,QB_MATRESP,QB_DEPSUP,D_E_L_E_T_,R_E_C_N_O_ from SQB950_A where QB_FILIAL = '04' 
    open MyCursor
    
    Fetch from MyCursor into @Filial,@Grupo,@Depto,@Descric,@CC ,@Regiao,@Filresp,@Matresp,@Depsup,@Delet ,@Recno 
    
    Declare CursorFilial cursor for 
          select distinct Z7_CODFIL from SZ7950 where Z7_EMP = '95'
    open CursorFilial
    
    Fetch from CursorFilial into @Filial_dest
    
    While ((@@FETCH_STATUS = 0))
    	begin
    
    		While ((@@FETCH_STATUS = 0 ))
    			  Begin
    		              
    					select @Recno = MAX(RECNO) from SQB950_A                                      
    					insert into SQB950_A values (@Filial_dest,@Grupo,@Depto,@Descric,@CC ,@Regiao,@Filresp,@Matresp,@Depsup,@Delet ,@Recno,0)
    		                  
    					Fetch  from MyCursor into @Recno, @Historico
    
    			  End
    		CLOSE MyCursor
    		DEALLOCATE MyCursor  
    	end
    
    CLOSE CursorFilial
    DEALLOCATE CursorFilial

    W.Marrane
    quarta-feira, 14 de abril de 2010 18:47

Respostas

  • Marrane,
    se entendi bem sua duvida  um cross join resolve seu problema

    teste este script

    declare @sz7 as table (campo1 varchar(max))
    insert into @sz7 values ('01 - Empresa 01')
    insert into @sz7 values ('02 - Empresa 02')

    declare @SQB950 as table (campo1 varchar(max))
    insert into @SQB950 values ('01 - registro 01')
    insert into @SQB950 values ('02 - registro 02')

    select b.campo1,a.campo1 from @sz7 a cross join @SQB950 b

    att.
    Marcelo Fernandes


    MCP, MCDBA, MCSA, MCTS. Se útil, classifique!!!
    • Marcado como Resposta W. Marrane quarta-feira, 14 de abril de 2010 21:25
    quarta-feira, 14 de abril de 2010 20:44
    Moderador
  • Pessoal consegui montar o código. Marcelo obrigado a atenção.

    Declare @Filial varchar(2)
    Declare @Grupo varchar(2)
    Declare @Depto varchar(14)
    Declare @Descric varchar(30)
    Declare @CC varchar(9)
    Declare @Regiao varchar(6)
    Declare @Filresp varchar(2)
    Declare @Matresp varchar(6)
    Declare @Depsup varchar(9)
    Declare @Delet varchar(1)
    Declare @Recno int
    Declare @DestFilial varchar(2)
    
    
    Set @DestFilial = ''
    Set @Recno = 1
    
    if (select count(*) from  ##SQB) >=1
    	TRUNCATE TABLE ##SQB
    
    insert into ##SQB select * from SQB950 where QB_FILIAL ='01'
    
    truncate table SQB950_A
    
    Declare CursorFilial cursor for 
          select distinct Z7_CODFIL from SZ7950 where Z7_EMP = '95'
    open CursorFilial
    
    Fetch from CursorFilial into @DestFilial
    
    While ((@@FETCH_STATUS = 0))
    	begin
    		
    		Declare MyCursor cursor for 
    			  select QB_FILIAL,QB_GRUPO,QB_DEPTO,QB_DESCRIC,QB_CC,QB_REGIAO,QB_FILRESP,QB_MATRESP,QB_DEPSUP,D_E_L_E_T_,R_E_C_N_O_ from ##SQB 
    		open MyCursor
    
    		Fetch from MyCursor into @Filial, @Grupo,@Depto,@Descric,@CC ,@Regiao,@Filresp,@Matresp,@Depsup,@Delet ,@Recno 
    
    		select @Recno = isnull(max(R_E_C_N_O_),1)+1 from SQB950_A
    		
    		print(@Recno)
    		
    		While ((@@FETCH_STATUS = 0 ))
    			  Begin
    		            
    					select @Recno = isnull(max(R_E_C_N_O_),1)+1 from SQB950_A
    					print(@Recno)			
    																		
    					insert into SQB950_A values (@DestFilial,isnull(@Grupo,''),@Depto,@Descric,@CC ,@Regiao,@Filresp,@Matresp,@Depsup,@Delet ,@Recno,0)
    		                  
    					Fetch  from MyCursor into @Filial,@Grupo,@Depto,@Descric,@CC ,@Regiao,@Filresp,@Matresp,@Depsup,@Delet ,@Recno 
    					
    			  End
    			  
    		CLOSE MyCursor
    		DEALLOCATE MyCursor  
    		
    		Fetch next from CursorFilial into @DestFilial
    	end
    
    
    CLOSE CursorFilial
    DEALLOCATE CursorFilial

    W.Marrane
    • Marcado como Resposta W. Marrane quarta-feira, 14 de abril de 2010 21:23
    quarta-feira, 14 de abril de 2010 21:23

Todas as Respostas

  • Marrane,

    Explique sua necessidade acho que vc nao precisa de cursor

    att.
    Marcelo Fernandes


    MCP, MCDBA, MCSA, MCTS. Se útil, classifique!!!
    quarta-feira, 14 de abril de 2010 19:52
    Moderador
  • Estou precisando popular um tabela da seguinte forma

     

    Tenho a tablela sz7

    01 - Empresa 01

    02 - Empresa 02

    Tabela SQB950

    1- 01 - registro 01 da empresa 01

    2- 01 - registro 02 da empresa 01

    3- 02 - registro 01 da empresa 02

    4- 02 - registro 02 da empresa 02

     

    Espero ter sido claro


    W.Marrane
    quarta-feira, 14 de abril de 2010 20:11
  • Marrane,
    se entendi bem sua duvida  um cross join resolve seu problema

    teste este script

    declare @sz7 as table (campo1 varchar(max))
    insert into @sz7 values ('01 - Empresa 01')
    insert into @sz7 values ('02 - Empresa 02')

    declare @SQB950 as table (campo1 varchar(max))
    insert into @SQB950 values ('01 - registro 01')
    insert into @SQB950 values ('02 - registro 02')

    select b.campo1,a.campo1 from @sz7 a cross join @SQB950 b

    att.
    Marcelo Fernandes


    MCP, MCDBA, MCSA, MCTS. Se útil, classifique!!!
    • Marcado como Resposta W. Marrane quarta-feira, 14 de abril de 2010 21:25
    quarta-feira, 14 de abril de 2010 20:44
    Moderador
  • Pessoal consegui montar o código. Marcelo obrigado a atenção.

    Declare @Filial varchar(2)
    Declare @Grupo varchar(2)
    Declare @Depto varchar(14)
    Declare @Descric varchar(30)
    Declare @CC varchar(9)
    Declare @Regiao varchar(6)
    Declare @Filresp varchar(2)
    Declare @Matresp varchar(6)
    Declare @Depsup varchar(9)
    Declare @Delet varchar(1)
    Declare @Recno int
    Declare @DestFilial varchar(2)
    
    
    Set @DestFilial = ''
    Set @Recno = 1
    
    if (select count(*) from  ##SQB) >=1
    	TRUNCATE TABLE ##SQB
    
    insert into ##SQB select * from SQB950 where QB_FILIAL ='01'
    
    truncate table SQB950_A
    
    Declare CursorFilial cursor for 
          select distinct Z7_CODFIL from SZ7950 where Z7_EMP = '95'
    open CursorFilial
    
    Fetch from CursorFilial into @DestFilial
    
    While ((@@FETCH_STATUS = 0))
    	begin
    		
    		Declare MyCursor cursor for 
    			  select QB_FILIAL,QB_GRUPO,QB_DEPTO,QB_DESCRIC,QB_CC,QB_REGIAO,QB_FILRESP,QB_MATRESP,QB_DEPSUP,D_E_L_E_T_,R_E_C_N_O_ from ##SQB 
    		open MyCursor
    
    		Fetch from MyCursor into @Filial, @Grupo,@Depto,@Descric,@CC ,@Regiao,@Filresp,@Matresp,@Depsup,@Delet ,@Recno 
    
    		select @Recno = isnull(max(R_E_C_N_O_),1)+1 from SQB950_A
    		
    		print(@Recno)
    		
    		While ((@@FETCH_STATUS = 0 ))
    			  Begin
    		            
    					select @Recno = isnull(max(R_E_C_N_O_),1)+1 from SQB950_A
    					print(@Recno)			
    																		
    					insert into SQB950_A values (@DestFilial,isnull(@Grupo,''),@Depto,@Descric,@CC ,@Regiao,@Filresp,@Matresp,@Depsup,@Delet ,@Recno,0)
    		                  
    					Fetch  from MyCursor into @Filial,@Grupo,@Depto,@Descric,@CC ,@Regiao,@Filresp,@Matresp,@Depsup,@Delet ,@Recno 
    					
    			  End
    			  
    		CLOSE MyCursor
    		DEALLOCATE MyCursor  
    		
    		Fetch next from CursorFilial into @DestFilial
    	end
    
    
    CLOSE CursorFilial
    DEALLOCATE CursorFilial

    W.Marrane
    • Marcado como Resposta W. Marrane quarta-feira, 14 de abril de 2010 21:23
    quarta-feira, 14 de abril de 2010 21:23
  • Pessoal consegui montar o código. Marcelo obrigado a atenção.

    Declare @Filial varchar(2)
    Declare @Grupo varchar(2)
    Declare @Depto varchar(14)
    Declare @Descric varchar(30)
    Declare @CC varchar(9)
    Declare @Regiao varchar(6)
    Declare @Filresp varchar(2)
    Declare @Matresp varchar(6)
    Declare @Depsup varchar(9)
    Declare @Delet varchar(1)
    Declare @Recno int
    Declare @DestFilial varchar(2)
    
    
    Set @DestFilial = ''
    Set @Recno = 1
    
    if (select count(*) from  ##SQB) >=1
    	TRUNCATE TABLE ##SQB
    
    insert into ##SQB select * from SQB950 where QB_FILIAL ='01'
    
    truncate table SQB950_A
    
    Declare CursorFilial cursor for 
          select distinct Z7_CODFIL from SZ7950 where Z7_EMP = '95'
    open CursorFilial
    
    Fetch from CursorFilial into @DestFilial
    
    While ((@@FETCH_STATUS = 0))
    	begin
    		
    		Declare MyCursor cursor for 
    			  select QB_FILIAL,QB_GRUPO,QB_DEPTO,QB_DESCRIC,QB_CC,QB_REGIAO,QB_FILRESP,QB_MATRESP,QB_DEPSUP,D_E_L_E_T_,R_E_C_N_O_ from ##SQB 
    		open MyCursor
    
    		Fetch from MyCursor into @Filial, @Grupo,@Depto,@Descric,@CC ,@Regiao,@Filresp,@Matresp,@Depsup,@Delet ,@Recno 
    
    		select @Recno = isnull(max(R_E_C_N_O_),1)+1 from SQB950_A
    		
    		print(@Recno)
    		
    		While ((@@FETCH_STATUS = 0 ))
    			  Begin
    		            
    					select @Recno = isnull(max(R_E_C_N_O_),1)+1 from SQB950_A
    					print(@Recno)			
    																		
    					insert into SQB950_A values (@DestFilial,isnull(@Grupo,''),@Depto,@Descric,@CC ,@Regiao,@Filresp,@Matresp,@Depsup,@Delet ,@Recno,0)
    		                  
    					Fetch  from MyCursor into @Filial,@Grupo,@Depto,@Descric,@CC ,@Regiao,@Filresp,@Matresp,@Depsup,@Delet ,@Recno 
    					
    			  End
    			  
    		CLOSE MyCursor
    		DEALLOCATE MyCursor  
    		
    		Fetch next from CursorFilial into @DestFilial
    	end
    
    
    CLOSE CursorFilial
    DEALLOCATE CursorFilial

    W.Marrane
    quarta-feira, 14 de abril de 2010 21:23