none
usar IF no return table RRS feed

  • Pergunta

  • Pessoal preciso  verificar se @data1 é is null, se for ele vai executar este select, mas se vier com dados executar outro select, não to conseguindo colocar um IF ai nesta instrução. Alguém pode dar uma força?

    CREATE FUNCTION func_DocsFiscal(@CodColigada int, @data1 datetime, @data2 datetime)
    returns table
    as

    return (SELECT  
    SEGDOC_DOCUMENTO.ID, SEGDOC_DOCUMENTO.NUMEROMOV, SEGDOC_DOCUMENTO.CODCFO, SEGDOC_DOCUMENTO.DATAVENCIMENTO,  
    SEGDOC_DOCUMENTO.OBSERVACAO, SEGDOC_DOCUMENTO.CODUSUARIO, SEGDOC_DOCUMENTO.DATA, SEGDOC_DOCUMENTO.STATUS_DOC,  
    SEGDOC_DOCUMENTO.IDMOV_OC, SEGDOC_DOCUMENTO.CODCOLIGADA, COLIGADA.NOMEFANTASIA, SEGDOC_DOCUMENTO.TP_PAGTO  
    FROM SEGDOC_DOCUMENTO   
    INNER JOIN servidor.DBO.GCOLIGADA AS COLIGADA ON SEGDOC_DOCUMENTO.CODCOLIGADA = COLIGADA.CODCOLIGADA 
    WHERE (SEGDOC_DOCUMENTO.status_doc  in ('1','6')) and (SEGDOC_DOCUMENTO.CODCOLIGADA = @codcoligada)  

    )


    Junior Santana


    • Editado Jr_inc sexta-feira, 12 de julho de 2013 13:34
    sexta-feira, 12 de julho de 2013 13:34

Respostas

  • Junior,

    Voce deve fazer um insert na tabela e não um select direto, execute este comando que irá funcionar:

    CREATE function dbo.func_DocsFiscal(@CodColigada int, @data1 datetime, @data2 datetime)
    returns @dt1 table(IDDOC int, NUMEROMOV varchar(25), CODCFO varchar(25), DATAVENCIMENTO datetime,  
    OBSERVACAO varchar(1000), CODUSUARIO varchar(25), DATA datetime, STATUS_DOC varchar(2),  
    IDMOV_OC int, CODCOLIGADA int, NOMEFANTASIA varchar(100), TP_PAGTO varchar(25))
    as 
    begin
    if (@data1 is null and @data2 is null)
    BEGIN
    INSERT INTO @dt1
    SELECT  
    SEGDOC_DOCUMENTO.ID, SEGDOC_DOCUMENTO.NUMEROMOV, SEGDOC_DOCUMENTO.CODCFO, SEGDOC_DOCUMENTO.DATAVENCIMENTO,  
    SEGDOC_DOCUMENTO.OBSERVACAO, SEGDOC_DOCUMENTO.CODUSUARIO, SEGDOC_DOCUMENTO.DATA, SEGDOC_DOCUMENTO.STATUS_DOC,  
    SEGDOC_DOCUMENTO.IDMOV_OC, SEGDOC_DOCUMENTO.CODCOLIGADA, COLIGADA.NOMEFANTASIA, SEGDOC_DOCUMENTO.TP_PAGTO  
    FROM SEGDOC_DOCUMENTO   
    INNER JOIN ALUPAR4.SERVIDOR.DBO.GCOLIGADA AS COLIGADA ON SEGDOC_DOCUMENTO.CODCOLIGADA = COLIGADA.CODCOLIGADA 
    WHERE (SEGDOC_DOCUMENTO.status_doc  in ('1','6')) and (SEGDOC_DOCUMENTO.CODCOLIGADA = @codcoligada)  
    END
    else
    BEGIN
    INSERT INTO @dt1
    SELECT  
    SEGDOC_DOCUMENTO.ID, SEGDOC_DOCUMENTO.NUMEROMOV, SEGDOC_DOCUMENTO.CODCFO, SEGDOC_DOCUMENTO.DATAVENCIMENTO,  
    SEGDOC_DOCUMENTO.OBSERVACAO, SEGDOC_DOCUMENTO.CODUSUARIO, SEGDOC_DOCUMENTO.DATA, SEGDOC_DOCUMENTO.STATUS_DOC,  
    SEGDOC_DOCUMENTO.IDMOV_OC, SEGDOC_DOCUMENTO.CODCOLIGADA, COLIGADA.NOMEFANTASIA, SEGDOC_DOCUMENTO.TP_PAGTO  
    FROM SEGDOC_DOCUMENTO   
    INNER JOIN ALUPAR4.SERVIDOR.DBO.GCOLIGADA AS COLIGADA ON SEGDOC_DOCUMENTO.CODCOLIGADA = COLIGADA.CODCOLIGADA
    WHERE (SEGDOC_DOCUMENTO.status_doc in ('1','6'))   
    AND (SEGDOC_DOCUMENTO.DATAVENCIMENTO Between @data1 and @data2)   
    and (SEGDOC_DOCUMENTO.CODCOLIGADA = @CodColigada) ORDER BY SEGDOC_DOCUMENTO.id DESC
    END
    return
    end


    Fabrizzio A. Caputo
    Certificações:
    MCT
    MCC
    Oracle OCA 11g
    MCTS SQL Server 2008 BI
    MCITP SQL Server 2008 Implementation and Maintenance
    MCITP SQL Server 2008 Developer
    ITIL V3 Foundation
    Blog Pessoal: www.fabrizziocaputo.wordpress.com
    Email: fabrizzio.antoniaci@gmail.com

    • Marcado como Resposta Jr_inc sexta-feira, 12 de julho de 2013 15:14
    sexta-feira, 12 de julho de 2013 14:46
    Moderador

Todas as Respostas

  • Junior,

    Uma vez que voce esta utilizando uma Table-Function voce deve ter uma estrutura semelhante nos 2 selects, ou seja, o que mudaria seriam os dados ou a origem dos dados, então voce terá apenas 1 tabela de retorno com a possibilidade de 2 preenchimentos distintos. Veja o exemplo abaixo:

    CREATE FUNCTION dbo.RetornarTabelaIf(@Hora INT)
    RETURNS @t1 TABLE(Id INT IDENTITY(1,1), Hora DATETIME, Nome VARCHAR(100))
    AS
    BEGIN
    	IF(@Hora <5)
    		INSERT INTO @t1 VALUES (GETDATE(), 'Fabrizzio')
    	ELSE
    		INSERT INTO @t1 VALUES (GETDATE(), 'Caputo')
    	
    	RETURN
    	
    END

    Agora, se seus 2 selects são diferentes (Um possui 3 campos outro possui 4 por exemplo), você está fugindo do conceito de uma Função Tabular e não será possível resolver desta maneira.


    <b>Fabrizzio A. Caputo</b><br/> MCT<br/> Certificações: <br/> Oracle OCA 11g<br/> MCTS SQL Server 2008 BI<br/> MCITP SQL Server 2008 Implementation and Maintenance<br/> MCITP SQL Server 2008 Developer <br/> ITIL V3 Foundation <br/> Blog Pessoal: <a href="http://fabrizziocaputo.wordpress.com">www.fabrizziocaputo.wordpress.com</a><br/> Email: fabrizzio.antoniaci@gmail.com

    sexta-feira, 12 de julho de 2013 13:46
    Moderador
  • Junior,

    Uma vez que voce esta utilizando uma Table-Function voce deve ter uma estrutura semelhante nos 2 selects, ou seja, o que mudaria seriam os dados ou a origem dos dados, então voce terá apenas 1 tabela de retorno com a possibilidade de 2 preenchimentos distintos. Veja o exemplo abaixo:

    CREATE FUNCTION dbo.RetornarTabelaIf(@Hora INT)
    RETURNS @t1 TABLE(Id INT IDENTITY(1,1), Hora DATETIME, Nome VARCHAR(100))
    AS
    BEGIN
    	IF(@Hora <5)
    		INSERT INTO @t1 VALUES (GETDATE(), 'Fabrizzio')
    	ELSE
    		INSERT INTO @t1 VALUES (GETDATE(), 'Caputo')
    	
    	RETURN
    	
    END

    Agora, se seus 2 selects são diferentes (Um possui 3 campos outro possui 4 por exemplo), você está fugindo do conceito de uma Função Tabular e não será possível resolver desta maneira.


    <b>Fabrizzio A. Caputo</b><br/> MCT<br/> Certificações: <br/> Oracle OCA 11g<br/> MCTS SQL Server 2008 BI<br/> MCITP SQL Server 2008 Implementation and Maintenance<br/> MCITP SQL Server 2008 Developer <br/> ITIL V3 Foundation <br/> Blog Pessoal: <a href="http://fabrizziocaputo.wordpress.com">www.fabrizziocaputo.wordpress.com</a><br/> Email: fabrizzio.antoniaci@gmail.com

    Olá Fabrizzio, os select são iguais, o que muda é clausula where. No outro where ele faz um between com as datas:

    --WHERE (SEGDOC_DOCUMENTO.status_doc in ('1','6'))   
    --AND (SEGDOC_DOCUMENTO.DATAVENCIMENTO Between @data1 and @data2)   
    --and (SEGDOC_DOCUMENTO.CODCOLIGADA = @CodColigada) ORDER BY SEGDOC_DOCUMENTO.id DESC 

    em resumo, esta função vai retornar sempre o mesmos campos, o relatório tem o critério de pesquisar com data ou sem datas, por isso queria fazer esta verificação e trocar o select ou o where.


    Junior Santana

    sexta-feira, 12 de julho de 2013 14:01
  • Junior,

    Basta então adaptar seus selects e o retorno da tabela para a estrutura que te passei como exemplo.


    Fabrizzio A. Caputo Certificações: MCT MCC Oracle OCA 11g MCTS SQL Server 2008 BI MCITP SQL Server 2008 Implementation and Maintenance MCITP SQL Server 2008 Developer ITIL V3 Foundation Blog Pessoal:www.fabrizziocaputo.wordpress.com Email: fabrizzio.antoniaci@gmail.com

    sexta-feira, 12 de julho de 2013 14:04
    Moderador
  • Junior,

    Basta então adaptar seus selects e o retorno da tabela para a estrutura que te passei como exemplo.


    Fabrizzio A. Caputo Certificações: MCT MCC Oracle OCA 11g MCTS SQL Server 2008 BI MCITP SQL Server 2008 Implementation and Maintenance MCITP SQL Server 2008 Developer ITIL V3 Foundation Blog Pessoal:www.fabrizziocaputo.wordpress.com Email: fabrizzio.antoniaci@gmail.com

    Fabrizzio, todos os campos do select tem que ser declarados no returns @dt1 table( >>>aqui<<< )?

    Junior Santana

    sexta-feira, 12 de julho de 2013 14:17
  • Junior,

    Sim, ai deve ser declarado a estrutura de retorno da sua função, ou seja, todos os campos.


    Fabrizzio A. Caputo
    Certificações:
    MCT
    MCC
    Oracle OCA 11g
    MCTS SQL Server 2008 BI
    MCITP SQL Server 2008 Implementation and Maintenance
    MCITP SQL Server 2008 Developer
    ITIL V3 Foundation
    Blog Pessoal: www.fabrizziocaputo.wordpress.com
    Email: fabrizzio.antoniaci@gmail.com


    sexta-feira, 12 de julho de 2013 14:21
    Moderador
  • Junior,

    Sim, ai deve ser declarado a estrutura de retorno da sua função, ou seja, todos os campos.


    Fabrizzio A. Caputo
    Certificações:
    MCT
    MCC
    Oracle OCA 11g
    MCTS SQL Server 2008 BI
    MCITP SQL Server 2008 Implementation and Maintenance
    MCITP SQL Server 2008 Developer
    ITIL V3 Foundation
    Blog Pessoal: www.fabrizziocaputo.wordpress.com
    Email: fabrizzio.antoniaci@gmail.com


    ficou assim:

    CREATE function dbo.func_DocsFiscal(@CodColigada int, @data1 datetime, @data2 datetime)
    returns @dt1 table(IDDOC int, NUMEROMOV varchar(25), CODCFO varchar(25), DATAVENCIMENTO datetime,  
    OBSERVACAO varchar(1000), CODUSUARIO varchar(25), DATA datetime, STATUS_DOC varchar(2),  
    IDMOV_OC int, CODCOLIGADA int, NOMEFANTASIA varchar(100), TP_PAGTO varchar(25))
    as 
    begin
    if (@data1 is null and @data2 is null)
    SELECT  
    SEGDOC_DOCUMENTO.ID, SEGDOC_DOCUMENTO.NUMEROMOV, SEGDOC_DOCUMENTO.CODCFO, SEGDOC_DOCUMENTO.DATAVENCIMENTO,  
    SEGDOC_DOCUMENTO.OBSERVACAO, SEGDOC_DOCUMENTO.CODUSUARIO, SEGDOC_DOCUMENTO.DATA, SEGDOC_DOCUMENTO.STATUS_DOC,  
    SEGDOC_DOCUMENTO.IDMOV_OC, SEGDOC_DOCUMENTO.CODCOLIGADA, COLIGADA.NOMEFANTASIA, SEGDOC_DOCUMENTO.TP_PAGTO  
    FROM SEGDOC_DOCUMENTO   
    INNER JOIN ALUPAR4.SERVIDOR.DBO.GCOLIGADA AS COLIGADA ON SEGDOC_DOCUMENTO.CODCOLIGADA = COLIGADA.CODCOLIGADA 
    WHERE (SEGDOC_DOCUMENTO.status_doc  in ('1','6')) and (SEGDOC_DOCUMENTO.CODCOLIGADA = @codcoligada)  
    else
    SELECT  
    SEGDOC_DOCUMENTO.ID, SEGDOC_DOCUMENTO.NUMEROMOV, SEGDOC_DOCUMENTO.CODCFO, SEGDOC_DOCUMENTO.DATAVENCIMENTO,  
    SEGDOC_DOCUMENTO.OBSERVACAO, SEGDOC_DOCUMENTO.CODUSUARIO, SEGDOC_DOCUMENTO.DATA, SEGDOC_DOCUMENTO.STATUS_DOC,  
    SEGDOC_DOCUMENTO.IDMOV_OC, SEGDOC_DOCUMENTO.CODCOLIGADA, COLIGADA.NOMEFANTASIA, SEGDOC_DOCUMENTO.TP_PAGTO  
    FROM SEGDOC_DOCUMENTO   
    INNER JOIN ALUPAR4.SERVIDOR.DBO.GCOLIGADA AS COLIGADA ON SEGDOC_DOCUMENTO.CODCOLIGADA = COLIGADA.CODCOLIGADA
    WHERE (SEGDOC_DOCUMENTO.status_doc in ('1','6'))   
    AND (SEGDOC_DOCUMENTO.DATAVENCIMENTO Between @data1 and @data2)   
    and (SEGDOC_DOCUMENTO.CODCOLIGADA = @CodColigada) ORDER BY SEGDOC_DOCUMENTO.id DESC  
    return
    end

    deu este erro:

    Msg 444, Level 16, State 2, Procedure func_DocsFiscal, Line 8
    Select statements included within a function cannot return data to a client.
    Msg 444, Level 16, State 2, Procedure func_DocsFiscal, Line 16
    Select statements included within a function cannot return data to a client.


    Junior Santana

    sexta-feira, 12 de julho de 2013 14:44
  • Junior,

    Voce deve fazer um insert na tabela e não um select direto, execute este comando que irá funcionar:

    CREATE function dbo.func_DocsFiscal(@CodColigada int, @data1 datetime, @data2 datetime)
    returns @dt1 table(IDDOC int, NUMEROMOV varchar(25), CODCFO varchar(25), DATAVENCIMENTO datetime,  
    OBSERVACAO varchar(1000), CODUSUARIO varchar(25), DATA datetime, STATUS_DOC varchar(2),  
    IDMOV_OC int, CODCOLIGADA int, NOMEFANTASIA varchar(100), TP_PAGTO varchar(25))
    as 
    begin
    if (@data1 is null and @data2 is null)
    BEGIN
    INSERT INTO @dt1
    SELECT  
    SEGDOC_DOCUMENTO.ID, SEGDOC_DOCUMENTO.NUMEROMOV, SEGDOC_DOCUMENTO.CODCFO, SEGDOC_DOCUMENTO.DATAVENCIMENTO,  
    SEGDOC_DOCUMENTO.OBSERVACAO, SEGDOC_DOCUMENTO.CODUSUARIO, SEGDOC_DOCUMENTO.DATA, SEGDOC_DOCUMENTO.STATUS_DOC,  
    SEGDOC_DOCUMENTO.IDMOV_OC, SEGDOC_DOCUMENTO.CODCOLIGADA, COLIGADA.NOMEFANTASIA, SEGDOC_DOCUMENTO.TP_PAGTO  
    FROM SEGDOC_DOCUMENTO   
    INNER JOIN ALUPAR4.SERVIDOR.DBO.GCOLIGADA AS COLIGADA ON SEGDOC_DOCUMENTO.CODCOLIGADA = COLIGADA.CODCOLIGADA 
    WHERE (SEGDOC_DOCUMENTO.status_doc  in ('1','6')) and (SEGDOC_DOCUMENTO.CODCOLIGADA = @codcoligada)  
    END
    else
    BEGIN
    INSERT INTO @dt1
    SELECT  
    SEGDOC_DOCUMENTO.ID, SEGDOC_DOCUMENTO.NUMEROMOV, SEGDOC_DOCUMENTO.CODCFO, SEGDOC_DOCUMENTO.DATAVENCIMENTO,  
    SEGDOC_DOCUMENTO.OBSERVACAO, SEGDOC_DOCUMENTO.CODUSUARIO, SEGDOC_DOCUMENTO.DATA, SEGDOC_DOCUMENTO.STATUS_DOC,  
    SEGDOC_DOCUMENTO.IDMOV_OC, SEGDOC_DOCUMENTO.CODCOLIGADA, COLIGADA.NOMEFANTASIA, SEGDOC_DOCUMENTO.TP_PAGTO  
    FROM SEGDOC_DOCUMENTO   
    INNER JOIN ALUPAR4.SERVIDOR.DBO.GCOLIGADA AS COLIGADA ON SEGDOC_DOCUMENTO.CODCOLIGADA = COLIGADA.CODCOLIGADA
    WHERE (SEGDOC_DOCUMENTO.status_doc in ('1','6'))   
    AND (SEGDOC_DOCUMENTO.DATAVENCIMENTO Between @data1 and @data2)   
    and (SEGDOC_DOCUMENTO.CODCOLIGADA = @CodColigada) ORDER BY SEGDOC_DOCUMENTO.id DESC
    END
    return
    end


    Fabrizzio A. Caputo
    Certificações:
    MCT
    MCC
    Oracle OCA 11g
    MCTS SQL Server 2008 BI
    MCITP SQL Server 2008 Implementation and Maintenance
    MCITP SQL Server 2008 Developer
    ITIL V3 Foundation
    Blog Pessoal: www.fabrizziocaputo.wordpress.com
    Email: fabrizzio.antoniaci@gmail.com

    • Marcado como Resposta Jr_inc sexta-feira, 12 de julho de 2013 15:14
    sexta-feira, 12 de julho de 2013 14:46
    Moderador
  • Junior,

    Voce deve fazer um insert na tabela e não um select direto, execute este comando que irá funcionar:

    CREATE function dbo.func_DocsFiscal(@CodColigada int, @data1 datetime, @data2 datetime)
    returns @dt1 table(IDDOC int, NUMEROMOV varchar(25), CODCFO varchar(25), DATAVENCIMENTO datetime,  
    OBSERVACAO varchar(1000), CODUSUARIO varchar(25), DATA datetime, STATUS_DOC varchar(2),  
    IDMOV_OC int, CODCOLIGADA int, NOMEFANTASIA varchar(100), TP_PAGTO varchar(25))
    as 
    begin
    if (@data1 is null and @data2 is null)
    BEGIN
    INSERT INTO @dt1
    SELECT  
    SEGDOC_DOCUMENTO.ID, SEGDOC_DOCUMENTO.NUMEROMOV, SEGDOC_DOCUMENTO.CODCFO, SEGDOC_DOCUMENTO.DATAVENCIMENTO,  
    SEGDOC_DOCUMENTO.OBSERVACAO, SEGDOC_DOCUMENTO.CODUSUARIO, SEGDOC_DOCUMENTO.DATA, SEGDOC_DOCUMENTO.STATUS_DOC,  
    SEGDOC_DOCUMENTO.IDMOV_OC, SEGDOC_DOCUMENTO.CODCOLIGADA, COLIGADA.NOMEFANTASIA, SEGDOC_DOCUMENTO.TP_PAGTO  
    FROM SEGDOC_DOCUMENTO   
    INNER JOIN ALUPAR4.SERVIDOR.DBO.GCOLIGADA AS COLIGADA ON SEGDOC_DOCUMENTO.CODCOLIGADA = COLIGADA.CODCOLIGADA 
    WHERE (SEGDOC_DOCUMENTO.status_doc  in ('1','6')) and (SEGDOC_DOCUMENTO.CODCOLIGADA = @codcoligada)  
    END
    else
    BEGIN
    INSERT INTO @dt1
    SELECT  
    SEGDOC_DOCUMENTO.ID, SEGDOC_DOCUMENTO.NUMEROMOV, SEGDOC_DOCUMENTO.CODCFO, SEGDOC_DOCUMENTO.DATAVENCIMENTO,  
    SEGDOC_DOCUMENTO.OBSERVACAO, SEGDOC_DOCUMENTO.CODUSUARIO, SEGDOC_DOCUMENTO.DATA, SEGDOC_DOCUMENTO.STATUS_DOC,  
    SEGDOC_DOCUMENTO.IDMOV_OC, SEGDOC_DOCUMENTO.CODCOLIGADA, COLIGADA.NOMEFANTASIA, SEGDOC_DOCUMENTO.TP_PAGTO  
    FROM SEGDOC_DOCUMENTO   
    INNER JOIN ALUPAR4.SERVIDOR.DBO.GCOLIGADA AS COLIGADA ON SEGDOC_DOCUMENTO.CODCOLIGADA = COLIGADA.CODCOLIGADA
    WHERE (SEGDOC_DOCUMENTO.status_doc in ('1','6'))   
    AND (SEGDOC_DOCUMENTO.DATAVENCIMENTO Between @data1 and @data2)   
    and (SEGDOC_DOCUMENTO.CODCOLIGADA = @CodColigada) ORDER BY SEGDOC_DOCUMENTO.id DESC
    END
    return
    end


    Fabrizzio A. Caputo
    Certificações:
    MCT
    MCC
    Oracle OCA 11g
    MCTS SQL Server 2008 BI
    MCITP SQL Server 2008 Implementation and Maintenance
    MCITP SQL Server 2008 Developer
    ITIL V3 Foundation
    Blog Pessoal: www.fabrizziocaputo.wordpress.com
    Email: fabrizzio.antoniaci@gmail.com

    Funcionou, valeu Obrigado

    Junior Santana

    sexta-feira, 12 de julho de 2013 15:14