none
Cursor em Uma Função RRS feed

  • Pergunta

  • Eu sei que não é possivel usar cursor dentro de uma função a questão é a seguinte como faço para simular um cursor dentro de uma função?

    O meu problema é o seguinte

    Preciso fazer um select de cabeçalho de nota e em logo abaixo os itens tudo isto feito em um select direto.

    Tem alguma forma de usar While em uma função deste tipo?

    Cabeçalho da nota: Nota 0001
    Produto1 - Valor - Quant
    Produto2 - Valor - Quant
    Produto3 - Valor - Quant

    Cabeçalho da nota: Nota 0002
    Produto10 - Valor - Quant
    Produto23 - Valor - Quant
    Produto03 - Valor - Quant

    sexta-feira, 10 de fevereiro de 2012 12:08

Respostas

  • Fabricio,

    Talvez o uso de comandos condicionais como While ou If possam ajudar, mas acredito que através do While forçando a execução com base em uma condição seria uma alternativa.

    Por exemplo:

    create table novousuario
     (
      codigo int identity(1,1),
      descricao varchar(10),
      data datetime,
      senha char(10))
    
    Insert Into NovoUsuario values('junior',getdate(),'')
    Insert Into NovoUsuario values('edu',getdate()-300,'')
    Insert Into NovoUsuario values('joão',getdate()-200,'')
    Insert Into NovoUsuario values('pedro',getdate()-100,'')
    Insert Into NovoUsuario values('fer',getdate()-10,'')
    
    Select * from NovoUsuario
    
    Declare @Codigo Int
    Set @Codigo=1
    
    While @Codigo <= (Select Count(Codigo) from NovoUsuario)
     Begin
      Select @Codigo=(Select Codigo from NovoUsuario Where codigo = @Codigo)
    
      Update NovoUsuario
      Set Senha=Convert(Char(10),Data ,103)
      Where Codigo = @Codigo
    
      Set @Codigo=@Codigo + 1
     End


    Pedro Antonio Galvão Junior [MVP | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | SorBR.Net | Professor Universitário | MSIT.com]

    • Sugerido como Resposta Junior Galvão - MVPMVP sexta-feira, 10 de fevereiro de 2012 12:34
    • Marcado como Resposta Eder Costa quarta-feira, 29 de fevereiro de 2012 15:02
    sexta-feira, 10 de fevereiro de 2012 12:10
  • Segue um exemplo:

    declare @Min as int,
            @Max as int
            
    -- cria uma tabela temporária com uma coluna sequencial para movimentar o While
    Select 
        *, 
        ROW_NUMBER() over(order by "chave primária") as N  
        into #tmp
    from 
        tblNotas        
        
    
    -- Pega o primeiro e último valor da tb temporária    
    select  
        @Min = MIN(N),
        @Max = MAX(N)
    from    
        #tmp
    
    -- MOVIMENTA O FALSO CURSOR.
    WHILE @Min <= @Max BEGIN
        
        SELECT * FROM #tmp WHERE N=@MIN
        
        SET @Min = @Min+1 -- OU SET @Min += 1
    
    END


    Se a minha ajuda lhe for útil não esqueça de classificar. Att. Leonardo Marcelino

    • Marcado como Resposta Eder Costa quarta-feira, 29 de fevereiro de 2012 15:02
    sexta-feira, 10 de fevereiro de 2012 16:33
  • Fabricio,

    Isso é uma regra que esta relacionada com a forma que as funções trabalham, como também, a maneira com que os dados processados dentro de uma função são apresentados e retornados para o usuário.


    Pedro Antonio Galvão Junior [MVP | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | SorBR.Net | Professor Universitário | MSIT.com]

    • Marcado como Resposta Eder Costa quarta-feira, 29 de fevereiro de 2012 15:02
    sexta-feira, 10 de fevereiro de 2012 12:34

Todas as Respostas

  • Fabricio,

    Talvez o uso de comandos condicionais como While ou If possam ajudar, mas acredito que através do While forçando a execução com base em uma condição seria uma alternativa.

    Por exemplo:

    create table novousuario
     (
      codigo int identity(1,1),
      descricao varchar(10),
      data datetime,
      senha char(10))
    
    Insert Into NovoUsuario values('junior',getdate(),'')
    Insert Into NovoUsuario values('edu',getdate()-300,'')
    Insert Into NovoUsuario values('joão',getdate()-200,'')
    Insert Into NovoUsuario values('pedro',getdate()-100,'')
    Insert Into NovoUsuario values('fer',getdate()-10,'')
    
    Select * from NovoUsuario
    
    Declare @Codigo Int
    Set @Codigo=1
    
    While @Codigo <= (Select Count(Codigo) from NovoUsuario)
     Begin
      Select @Codigo=(Select Codigo from NovoUsuario Where codigo = @Codigo)
    
      Update NovoUsuario
      Set Senha=Convert(Char(10),Data ,103)
      Where Codigo = @Codigo
    
      Set @Codigo=@Codigo + 1
     End


    Pedro Antonio Galvão Junior [MVP | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | SorBR.Net | Professor Universitário | MSIT.com]

    • Sugerido como Resposta Junior Galvão - MVPMVP sexta-feira, 10 de fevereiro de 2012 12:34
    • Marcado como Resposta Eder Costa quarta-feira, 29 de fevereiro de 2012 15:02
    sexta-feira, 10 de fevereiro de 2012 12:10
  • Muito obrigado pela ajuda já abriu novos horizontes, mas gostaria de saber porque não se pode usar cursor em função seria o máximo.
    sexta-feira, 10 de fevereiro de 2012 12:30
  • Fabricio,

    Isso é uma regra que esta relacionada com a forma que as funções trabalham, como também, a maneira com que os dados processados dentro de uma função são apresentados e retornados para o usuário.


    Pedro Antonio Galvão Junior [MVP | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | SorBR.Net | Professor Universitário | MSIT.com]

    • Marcado como Resposta Eder Costa quarta-feira, 29 de fevereiro de 2012 15:02
    sexta-feira, 10 de fevereiro de 2012 12:34
  • Junior Galvão eu gostaria de saber como fazer um while de um select isto é possivel.

    Exemplo

    While Select * from tblNotas !Eof

    Begin

     

       

    End.

    sexta-feira, 10 de fevereiro de 2012 16:20
  • Segue um exemplo:

    declare @Min as int,
            @Max as int
            
    -- cria uma tabela temporária com uma coluna sequencial para movimentar o While
    Select 
        *, 
        ROW_NUMBER() over(order by "chave primária") as N  
        into #tmp
    from 
        tblNotas        
        
    
    -- Pega o primeiro e último valor da tb temporária    
    select  
        @Min = MIN(N),
        @Max = MAX(N)
    from    
        #tmp
    
    -- MOVIMENTA O FALSO CURSOR.
    WHILE @Min <= @Max BEGIN
        
        SELECT * FROM #tmp WHERE N=@MIN
        
        SET @Min = @Min+1 -- OU SET @Min += 1
    
    END


    Se a minha ajuda lhe for útil não esqueça de classificar. Att. Leonardo Marcelino

    • Marcado como Resposta Eder Costa quarta-feira, 29 de fevereiro de 2012 15:02
    sexta-feira, 10 de fevereiro de 2012 16:33