Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

tanaka_

consulta sql passando 4 parâmetros de forma dinâmica

Recommended Posts

Bom dia,

Senhores.

 

Preciso de auxilo para executar a seguinte consulta sql, porém de forma dinâmica.

 

Alguém pode me ajudar ?

 

select * from fn_ValorDevolver(1,'000309','0015','00',GETDATE())

 

1 = codigo da empresa fixo

000309 = grupo existe vários

0015 = número do participante = existe vários

getdate() = data base

Compartilhar este post


Link para o post
Compartilhar em outros sites

Fala, Tanaka! tranquilão?

 

Cara fiz alguns exemplos ai... olha se algum te atende...

 

qualquer coisa, só entrar em contato!

abraço!

 

 

 

use tempdb
go
----------------------------------------------------------------------------------------------
-- Criando dos objetos aleatorios para testes malucos
----------------------------------------------------------------------------------------------
if object_id('tabela1') is not null
drop table tabela1

if object_id('fn_valordevolver') is not null
drop function fn_valordevolver

go
create table tabela1 (empresa int, grupo char(6), numero char(4), valortotal money, datacontrato datetime)

go
create function dbo.fn_valordevolver (@empresa int, @grupo char(6), @numero char(4), @data datetime)
returns @tabela table
(
parcela1 money,
parcela2 money,
parcela3 money
)
as
begin
declare @valorparcela money

select @valorparcela = valortotal from tabela1
where empresa = @empresa and grupo = @grupo and numero = @numero
and datacontrato > @data

insert into @tabela select @valorparcela/3, @valorparcela/3, @valorparcela/3
return
end

----------------------------------------------------------------------------------------------
-- Populando objetos pra teste
----------------------------------------------------------------------------------------------
go
insert into tabela1 values (1,'000309','',3,'20160501')
insert into tabela1 values (1,'000310','0016',6,'20160501')
insert into tabela1 values (1,'000311','0017',9,'20160501')
insert into tabela1 values (1,'000312','0018',12,'20160501')
insert into tabela1 values (1,'000313','0019',15,'20160501')
insert into tabela1 values (1,'000314','0020',18,'20160501')


----------------------------------------------------------------------------------------------
-- testando com cross apply
----------------------------------------------------------------------------------------------
select * from tabela1

select
*
from tabela1
cross apply dbo.fn_valordevolver(empresa,grupo,numero,getdate())


go
----------------------------------------------------------------------------------------------
-- testando apenas a função com script dinamico maluco
----------------------------------------------------------------------------------------------

declare @cmd varchar(max)
set @cmd = ''
select @cmd = @cmd + 'select * from dbo.fn_valordevolver('+convert(varchar,empresa)+','''+grupo+''','''+numero+''',getdate())'+char(10)+'union all'+char(10)
from tabela1 --tabela ou select que retorna os valores que serão passados dinamicamente pra função

set @cmd = left(@cmd,len(@cmd)-9)--excluindo o ultimo union all
exec(@cmd)

go
----------------------------------------------------------------------------------------------
-- testando apenas a função com script dinamico maluco jogando resultado pra uma tabela
----------------------------------------------------------------------------------------------
declare @cmd varchar(max)
declare @tabela table(
primeiraparcela money,
dataprimeiraparcela datetime,
segundaparcela money,
datasegundaparcela datetime,
terceiraparcela money,
dataterceiraparcela datetime
)

set @cmd = ''
select @cmd = @cmd +
'select
parcela1,
dateadd(M,1,getdate()),
parcela2,
dateadd(M,2,getdate()),
parcela3,
dateadd(M,3,getdate())
from dbo.fn_valordevolver('+convert(varchar,empresa)+','''+grupo+''','''+numero+''',getdate())'+char(10)
from tabela1 --tabela ou select que retorna os valores que serão passados dinamicamente pra função


insert into @tabela exec(@cmd)

select * from @tabela

go

----------------------------------------------------------------------------------------------
-- Cursor -- menos indicado
----------------------------------------------------------------------------------------------
declare @cmd varchar(max)
declare @tabela table(
primeiraparcela money,
segundaparcela money,
terceiraparcela money
)
declare
@empresa int,
@grupo char(6),
@numero char(4)

declare executafuncao cursor for
select empresa, grupo, numero from tabela1
open executafuncao
fetch next from executafuncao into @empresa, @grupo, @numero
while @@fetch_status = 0
begin
insert into @tabela select * from dbo.fn_valordevolver(@empresa,@grupo,@numero,getdate())

fetch next from executafuncao into @empresa, @grupo, @numero
end
close executafuncao
deallocate executafuncao

select * from @tabela

go

if object_id('tabela1') is not null
drop table tabela1

if object_id('fn_valordevolver') is not null
drop function fn_valordevolver

Compartilhar este post


Link para o post
Compartilhar em outros sites

Nossa...

Que coisa complicada rs

 

eu esperava algo mais fácil.

 

Tipo...

 

select * from fn_ValorDevolver(select a.id_empresa,a.cd_cota,a.cd_cota,a.versao,getdate() from conbi001 as a where id_grupo in ('300','315'))

 

 

Neste caso utilizar um sub select para pegar os dados e passar com parâmetro, porém, não executa. :wacko:

Compartilhar este post


Link para o post
Compartilhar em outros sites

Mais facil tipo.... o primeiro exemplo, com cross apply?

 

select
*
from tabela1
cross apply dbo.fn_valordevolver(empresa,grupo,numero,getdate())

 

que no seu caso ficaria tipo

 

select
*
from conbi001
cross apply fn_ValorDevolver (id_empresa, cd_cota, versao, getdate()).....

 

coloquei os * pq não sei os nomes das colunas que sua função retorna

 

Abraço!

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.