Usuário com melhor resposta
Programação de Function

Pergunta
-
Pessoal,
Estou tentando criar uma Function que retorne o valor de duas tabelas distintas. O problema é o seguinte:
Escreva uma função que retorne a renda salarial de todos os clientes, incluindo na renda de cada um o salário do seu cônjuge daqueles que são casados.
Tables:
create table cliente
(
cod int not null identity,
nome varchar(50),
renda float,
estadoCivil varchar(20)
);create table conjuge
(
codCliente int not null,
nome_conjuge varchar(50),
renda_conjuge float
);Construi o seguinte código:
create function rendaCliente (@Codigo int)
returns float
as
begin
declare @rendaCli float = (select renda from cliente where cod = 3)
declare @rendaConjuge float = (select renda_conjuge from conjuge where codCliente = 3)
declare @ec varchar(20) = (select estadoCivil from cliente where cod = 3)
declare @renda float
select renda, nome from cliente where estadoCivil = @ec
if(@ec = 'solteiro')
set @renda = @rendaCli
else if(@ec = 'casado')
set @renda = @rendaConjuge + @rendaCli
return @renda
endSó que me traz o erro de que não posso retornar um valor para o cliente, ou seja, não estou conseguindo inserir somente o valor da variável.
Alguém pode me ajudar, por favor???
segunda-feira, 19 de maio de 2014 13:51
Respostas
-
J.Neves,
O problema é que você definiu uma consulta sem adicionar seu retorno em nenhuma variável.
Veja o script abaixo(removi apenas à consulta antes do IF) e faça às adaptações de acordo com sua necessidade:
create function rendaCliente (@Codigo int) returns float as begin declare @rendaCli float = (select renda from cliente where cod = 3) declare @rendaConjuge float = (select renda_conjuge from conjuge where codCliente = 3) declare @ec varchar(20) = (select estadoCivil from cliente where cod = 3) declare @renda float if(@ec = 'solteiro') set @renda = @rendaCli else if(@ec = 'casado') set @renda = @rendaConjuge + @rendaCli return @renda end GO
Se ajudou na sua solução, não esqueça de marcar como resposta !
Abraços,
Durval RamosMicrosoft Partner | MTA | MCSA - SQL Server 2012 | MCSE - Data Platform---------------------------------- Se foi resolvido clique "Marcar como resposta" e se foi útil "Votar como Útil"- Sugerido como Resposta Junior Galvão - MVPMVP quarta-feira, 21 de maio de 2014 13:45
- Marcado como Resposta Durval RamosModerator sexta-feira, 20 de junho de 2014 02:10
segunda-feira, 19 de maio de 2014 20:21Moderador
Todas as Respostas
-
J.Neves,
O problema é que você definiu uma consulta sem adicionar seu retorno em nenhuma variável.
Veja o script abaixo(removi apenas à consulta antes do IF) e faça às adaptações de acordo com sua necessidade:
create function rendaCliente (@Codigo int) returns float as begin declare @rendaCli float = (select renda from cliente where cod = 3) declare @rendaConjuge float = (select renda_conjuge from conjuge where codCliente = 3) declare @ec varchar(20) = (select estadoCivil from cliente where cod = 3) declare @renda float if(@ec = 'solteiro') set @renda = @rendaCli else if(@ec = 'casado') set @renda = @rendaConjuge + @rendaCli return @renda end GO
Se ajudou na sua solução, não esqueça de marcar como resposta !
Abraços,
Durval RamosMicrosoft Partner | MTA | MCSA - SQL Server 2012 | MCSE - Data Platform---------------------------------- Se foi resolvido clique "Marcar como resposta" e se foi útil "Votar como Útil"- Sugerido como Resposta Junior Galvão - MVPMVP quarta-feira, 21 de maio de 2014 13:45
- Marcado como Resposta Durval RamosModerator sexta-feira, 20 de junho de 2014 02:10
segunda-feira, 19 de maio de 2014 20:21Moderador -
J.Neves,
Quando estamos trabalhando com Function o comando Select só pode ser utilizado como mecanismo de retorno dos dados para algum elemento dentro da Function, neste caso, o Select sozinho é reconhecido e interpretado como um retorno, por isso o Query Processor esta retornando esta mensagem de erro:
"Select statements included within a function cannot return data to a client."
Com o Durval citou, removendo esta linha este erro não é mais apresentando, mas no seu caso, talvez será necessário você pegar o valor deste Select e armazenar em alguma outra variável!!!
Mas veja que no seu código você já esta armazenando a renda e não o nome, então fiz uma pequena mudança no Código:
create function rendaCliente (@Codigo int) returns float as begin declare @rendaCli float = (select renda from cliente where cod = 3) declare @rendaConjuge float = (select renda_conjuge from conjuge where codCliente = 3) declare @ec varchar(20) = (select estadoCivil from cliente where cod = 3) declare @renda float Declare @nome varchar(50) Select @Nome=Nome from cliente where estadoCivil = @ec if(@ec = 'solteiro') set @renda = @rendaCli else if(@ec = 'casado') set @renda = @rendaConjuge + @rendaCli return @renda 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]
quarta-feira, 21 de maio de 2014 13:51