Usuário com melhor resposta
usar IF no return table

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
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
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
-
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 DESCem 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
-
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
-
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
Junior Santana
-
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- Editado Fabrizzio CaputoModerator sexta-feira, 12 de julho de 2013 14:21 Edição
-
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
enddeu 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
-
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
-
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.comJunior Santana