none
Como fazer um while read dentro de outro while read RRS feed

  • Pergunta


  • Pessoas sou novato no vb.net e to com a seguinte duvida

    crei um tabela temporaria no SQL Server para armazer varios dados que eu importei de um arquivo texto e depois fiz um cross join com essa tabela temporaria para acabar de amarrar as informações que eu necessito para inserir ou dar update no banco para armazenar essas informações.

    a questão é preciso fazer um while read() com a tabela temporaria, abrir um novo reader para ver se a informação existe e dar o insert ou update no banco.

    Algum poderia de dar uma luz de como fazer isso?

    Att.


    segunda-feira, 26 de março de 2012 13:11

Respostas

  • Acredito que para isso vc precisara usar cursor.

    Mais ou menos assim.

    CREATE proc [dbo].[NOMEPROC]
    as
    begin
    	declare 
    		@data datetime
    		,@IdCadastro	int
    		,@IdArea	int
    		,@Nome	VARCHAR(100)
                    ,@NomeLog	VARCHAR(100)    
    		,@Sobrenome	varchar(100)
    		,@SobrenomeLog	varchar(100)
    		,@Cpf	varchar(11)
    
            DECLARE #TBL_TEMP TABLE(NOME VARCHAR(100), QTDLOG INT)   
    		
    	
    	DECLARE CursorEnviar CURSOR FOR 
    		select 
    		  data
    		  ,IdCadastro
    		  ,IdArea
    		  ,Nome
    		  ,Sobrenome
    		  ,Cpf
    		from cadastro where
    			convert(nvarchar(10),datacadastro, 103) = convert(nvarchar(10), @data, 103)		
    		
                   --Abrindo cursor
    		OPEN CursorEnviar
    		
    		
    		--Atribuindo valores do select nas variáveis
    		FETCH NEXT FROM CursorEnviar INTO 
    			  @data
    	   	         ,@IdCadastro
    		         ,@IdArea
    		         ,@Nome
    		         ,@Sobrenome
    		         ,@Cpf
    			
    			--Iniciando laço
    		WHILE @@FETCH_STATUS = 0
    		 BEGIN
                        DECLARE 
                           @CONT_AUX INT
                          ,@NOME_AUX VARCHAR(100)
                        DECLARE CursorLog CURSOR FOR 
    		      select 
    		        NomeLog
                           ,SobreNomeLog
            	      from cadastroLog where   idCadastro = @IdCadastro
              
                    --ABRE CURSOR 2
                    OPEN CursorLog
    
                    --pega 1ºlinha
                    FETCH NEXT FROM CursorEnviar INTO 
    			  @NomeLog
    		         ,@SobrenomeLog
    		         
    
                    --percorre o log de cadastro
                      WHILE @@FETCH_STATUS = 0
                         
                         SET @CONT_AUX = @CONT_AUX + 1 
                         SET @NOME_AUX = SELECT @NomeLog + ' ' +
    		         @SobrenomeLog AS NOME
                         FETCH NEXT FROM CursorEnviar INTO 
    			  @NomeLog
    		         ,@SobrenomeLog
    
                      END
                      INSERT INTO #TBL_TEMP (NOME, QTDLOG)VALUES(@NOME_AUX, @CONT_AUX)
    
                      		--Fechando e desalocando cursor
    		CLOSE CursorLog
    
                    set @CONT_AUX = 0
    
        		 --Próxima linha do cursor (CursorEnviar )
    		 FETCH NEXT FROM CursorEnviar INTO 
    			  @data
    	   	         ,@IdCadastro
    		         ,@IdArea
    		         ,@Nome
    		         ,@Sobrenome
    		         ,@Cpf
    		END
    		
    		--Fechando e desalocando cursor
    		CLOSE CursorEnviar
    		DEALLOCATE CursorEnviar
    
                  SELECT * FROM #TBL_TEMP
                  DROP TABLE #TBL_TEMP
    END
    
    
    
    

    att.

    segunda-feira, 26 de março de 2012 13:49
  • Na segunda query que  voce precisa fazer, por que voce não faz um count e dá um ExecuteScalar() para ver se a informação existe ai voce pode dar o insert ou o update que voce precisa.



    http://renefc3.wordpress.com/ renefc3@gmail.com @renefc3

    quinta-feira, 29 de março de 2012 00:51

Todas as Respostas

  • Acredito que para isso vc precisara usar cursor.

    Mais ou menos assim.

    CREATE proc [dbo].[NOMEPROC]
    as
    begin
    	declare 
    		@data datetime
    		,@IdCadastro	int
    		,@IdArea	int
    		,@Nome	VARCHAR(100)
                    ,@NomeLog	VARCHAR(100)    
    		,@Sobrenome	varchar(100)
    		,@SobrenomeLog	varchar(100)
    		,@Cpf	varchar(11)
    
            DECLARE #TBL_TEMP TABLE(NOME VARCHAR(100), QTDLOG INT)   
    		
    	
    	DECLARE CursorEnviar CURSOR FOR 
    		select 
    		  data
    		  ,IdCadastro
    		  ,IdArea
    		  ,Nome
    		  ,Sobrenome
    		  ,Cpf
    		from cadastro where
    			convert(nvarchar(10),datacadastro, 103) = convert(nvarchar(10), @data, 103)		
    		
                   --Abrindo cursor
    		OPEN CursorEnviar
    		
    		
    		--Atribuindo valores do select nas variáveis
    		FETCH NEXT FROM CursorEnviar INTO 
    			  @data
    	   	         ,@IdCadastro
    		         ,@IdArea
    		         ,@Nome
    		         ,@Sobrenome
    		         ,@Cpf
    			
    			--Iniciando laço
    		WHILE @@FETCH_STATUS = 0
    		 BEGIN
                        DECLARE 
                           @CONT_AUX INT
                          ,@NOME_AUX VARCHAR(100)
                        DECLARE CursorLog CURSOR FOR 
    		      select 
    		        NomeLog
                           ,SobreNomeLog
            	      from cadastroLog where   idCadastro = @IdCadastro
              
                    --ABRE CURSOR 2
                    OPEN CursorLog
    
                    --pega 1ºlinha
                    FETCH NEXT FROM CursorEnviar INTO 
    			  @NomeLog
    		         ,@SobrenomeLog
    		         
    
                    --percorre o log de cadastro
                      WHILE @@FETCH_STATUS = 0
                         
                         SET @CONT_AUX = @CONT_AUX + 1 
                         SET @NOME_AUX = SELECT @NomeLog + ' ' +
    		         @SobrenomeLog AS NOME
                         FETCH NEXT FROM CursorEnviar INTO 
    			  @NomeLog
    		         ,@SobrenomeLog
    
                      END
                      INSERT INTO #TBL_TEMP (NOME, QTDLOG)VALUES(@NOME_AUX, @CONT_AUX)
    
                      		--Fechando e desalocando cursor
    		CLOSE CursorLog
    
                    set @CONT_AUX = 0
    
        		 --Próxima linha do cursor (CursorEnviar )
    		 FETCH NEXT FROM CursorEnviar INTO 
    			  @data
    	   	         ,@IdCadastro
    		         ,@IdArea
    		         ,@Nome
    		         ,@Sobrenome
    		         ,@Cpf
    		END
    		
    		--Fechando e desalocando cursor
    		CLOSE CursorEnviar
    		DEALLOCATE CursorEnviar
    
                  SELECT * FROM #TBL_TEMP
                  DROP TABLE #TBL_TEMP
    END
    
    
    
    

    att.

    segunda-feira, 26 de março de 2012 13:49
  • Na segunda query que  voce precisa fazer, por que voce não faz um count e dá um ExecuteScalar() para ver se a informação existe ai voce pode dar o insert ou o update que voce precisa.



    http://renefc3.wordpress.com/ renefc3@gmail.com @renefc3

    quinta-feira, 29 de março de 2012 00:51