none
problema em criar function de retorno RRS feed

  • Pergunta

  • Ola pessoal.

    Bom, estou tentando criar uma function recursiva mais esta dando erro alguém poderia me ajudar 

    CREATE FUNCTION dbo.fnGetUltimoIdMovFinanceiroByidMovFinan
    (
    @idMovFinan int
     )  
       
       
       WITH CTEMovimentoFinanceiro(idMovFinan,idProxMovFinan,Nivel)
       
       AS
      
       (
        
        -- Ancora
        SELECT IdMovFinanceiro,idProxMovFinan,0 AS 'Nivel'
          FROM MovimentoFinanceiro 
         WHERE IdMovFinanceiro = @idMovFinan 
        
        UNION ALL
        
        -- Parte RECURSIVA
        SELECT M.idMovFinanceiro,M.IdProxMovFinan,CTE.Nivel + 1 AS 'Nivel'
          FROM MovimentoFinanceiro M 
          INNER JOIN CTEMovimentoFinanceiro CTE ON M.IdMovFinanceiro = CTE.idProxMovFinan
          )
          SELECT Nivel,idMovFinan,idProxMovFinan 
          FROM CTEMovimentoFinanceiro
          where idProxMovFinan is null
           
           return 

       
    GO

     

    terça-feira, 12 de maio de 2015 11:54

Respostas

  • Cara muito obrigado pela colaboração, mais conseguir fazer o que precisava que era 

    CREATE FUNCTION dbo.fnGetUltimoIdMovFinanceiroByidMovFinan
    (
     @idMovFinan int 
    )
    RETURNS INT
    BEGIN
     DECLARE @idMovFinanRetorno INT;//declarar 

     WITH CTEMovimentoFinanceiro(idMovFinan,idProxMovFinan,Nivel)
     AS
     (

      -- Ancora
      SELECT IdMovFinanceiro,idProxMovFinan,0 AS 'Nivel'
        FROM MovimentoFinanceiro 
       WHERE IdMovFinanceiro = @idMovFinan 

      UNION ALL

      -- Parte RECURSIVA
      SELECT M.idMovFinanceiro,M.IdProxMovFinan,CTE.Nivel + 1 AS 'Nivel'
        FROM MovimentoFinanceiro M 
        INNER JOIN CTEMovimentoFinanceiro CTE ON M.IdMovFinanceiro = CTE.idProxMovFinan
          )

       --Variável de Retorno
       SELECT @idMovFinanRetorno = idMovFinan FROM CTEMovimentoFinanceiro WHERE idProxMovFinan IS NULL 

       RETURN (@idMovFinanRetorno)// e retornar 

    END 
    GO

    muito obrigado pela atenção

                         
    • Marcado como Resposta Antonio.lima terça-feira, 12 de maio de 2015 14:01
    terça-feira, 12 de maio de 2015 14:01

Todas as Respostas

  • Bom dia,

    Não sei se entendi corretamente o resultado que você deseja obter, mas experimente:

    CREATE FUNCTION dbo.fnGetUltimoIdMovFinanceiroByidMovFinan
    (
      @idMovFinan int
    )  
    RETURNS @MovimentoFinanceiro TABLE 
    (
        Nivel int,
        IdMovFinanceiro int,
        IdProxMovFinan int
    )
    AS
    BEGIN
       
       WITH CTEMovimentoFinanceiro(idMovFinan,idProxMovFinan,Nivel)
       
       AS
      
       (
        
        -- Ancora
        SELECT IdMovFinanceiro,idProxMovFinan,0 AS 'Nivel'
          FROM MovimentoFinanceiro 
         WHERE IdMovFinanceiro = @idMovFinan 
        
        UNION ALL
        
        -- Parte RECURSIVA
        SELECT M.idMovFinanceiro,M.IdProxMovFinan,CTE.Nivel + 1 AS 'Nivel'
          FROM MovimentoFinanceiro M 
          INNER JOIN CTEMovimentoFinanceiro CTE ON M.IdMovFinanceiro = CTE.idProxMovFinan
          )
    
      INSERT INTO @MovimentoFinanceiro (Nivel, IdMovFinanceiro, IdProxMovFinan)
          SELECT Nivel, idMovFinanceiro, idProxMovFinan 
          FROM CTEMovimentoFinanceiro
          where idProxMovFinan is null
           
      return;
    END;

    Espero que ajude.


    Assinatura: http://www.imoveisemexposicao.com.br

    terça-feira, 12 de maio de 2015 13:15
  • Cara muito obrigado pela colaboração, mais conseguir fazer o que precisava que era 

    CREATE FUNCTION dbo.fnGetUltimoIdMovFinanceiroByidMovFinan
    (
     @idMovFinan int 
    )
    RETURNS INT
    BEGIN
     DECLARE @idMovFinanRetorno INT;//declarar 

     WITH CTEMovimentoFinanceiro(idMovFinan,idProxMovFinan,Nivel)
     AS
     (

      -- Ancora
      SELECT IdMovFinanceiro,idProxMovFinan,0 AS 'Nivel'
        FROM MovimentoFinanceiro 
       WHERE IdMovFinanceiro = @idMovFinan 

      UNION ALL

      -- Parte RECURSIVA
      SELECT M.idMovFinanceiro,M.IdProxMovFinan,CTE.Nivel + 1 AS 'Nivel'
        FROM MovimentoFinanceiro M 
        INNER JOIN CTEMovimentoFinanceiro CTE ON M.IdMovFinanceiro = CTE.idProxMovFinan
          )

       --Variável de Retorno
       SELECT @idMovFinanRetorno = idMovFinan FROM CTEMovimentoFinanceiro WHERE idProxMovFinan IS NULL 

       RETURN (@idMovFinanRetorno)// e retornar 

    END 
    GO

    muito obrigado pela atenção

                         
    • Marcado como Resposta Antonio.lima terça-feira, 12 de maio de 2015 14:01
    terça-feira, 12 de maio de 2015 14:01