Ir para conteúdo

Arquivado

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

João Fernandes dos Santos

Insert into coletivo sem cursor

Recommended Posts

Pessoal boa tarde.

 

 

Estou tentando fazer um insert e preciso que seja um insert coletivo.

 

Ex:

codigos produto: 10 - 20 -30 - 40 

declare @idaplicacao int = 10
insert into AplicacaoxProduto(@idaplicacao,codProduto)values (aqui quero inserir vários cod do produto com omesmo id da aplicação = 10)


resultado final teria que ser

 

idaplicacao | cod produto

10 10

10 20

10 30

10 40

 

 

Se intenderam, Isso é possível sem usar o cursor?

 

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não existe um limite....

mas cuidado com estes "cursores"... em ambientes que administro não permito o uso deles devido ao alto consumo de CPU e Memoria

Compartilhar este post


Link para o post
Compartilhar em outros sites

João, avalie a seguinte sugestão:

-- declaração das tabelas de produtos e de aplicações
declare @Produto table (CodProduto int, TitProduto varchar(35), DescProduto varchar(200));
declare @Aplicação table (CodAplicação int, DescAplicação varchar(35));

-- carga de dados de testes 
INSERT into @Produto values 
  (10, 'Produto 10', 'descrição do produto 10'),
  (20, 'Produto 20', 'descrição do produto 20'),
  (30, 'Produto 30', 'descrição do produto 30'),
  (40, 'Produto 40', 'descrição do produto 40');

INSERT into @Aplicação values
  (10, 'aplicação 10'), (15, 'aplicação 15');


-- comando para montar relacionamento entre aplicação e produto (sem uso de cursor)
INSERT into Aplicacao_Produto (IdAplicacao, CodProduto) 
  SELECT A.CodAplicação, P.CodProduto
    from @Aplicação as A
         cross join @Produto as P;

José Diz. Belo Horizonte, MG - Brasil

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não existe um limite....

mas cuidado com estes "cursores"... em ambientes que administro não permito o uso deles devido ao alto consumo de CPU e Memoria

 

Fala José Diz, também sou de BH :joia:

 

A.Jr, primeiramente, me desculpe pelo post, mas tive que colocar seu tópico a prova quando li “Para isso, podemos utilizar o WHILE. Abaixo um exemplo simples, porém com uma performance bem superior ao CURSOR

 

1 - Criei a tabela #mytemp com as mesmas colunas pra ficar identico ao exemplo do link: https://adjuniordba.wordpress.com/2013/07/04/while-para-cursores/

 

dei uma carga de 1.000.000 de registros nessa tabela (pq n gosto de testes feitos com pouca coisa) e não criei nenhum indice (o teste tem que ser feito no hard)

 

executei o while do exemplo....

 

declare @count bigint

set rowcount 0

set rowcount 1

select @count = au_id from #mytemp

 

while @@rowcount <> 0

 

begin

set rowcount 0

 

select au_id,au_lname,au_fname from #mytemp where au_id = @count

 

delete #mytemp where au_id = @count

 

set rowcount 1

select @count = au_id from #mytemp

 

end

 

o resultado que tive foi:

 

============================================================================================

 

 

SQL Server Execution Times:

CPU time = 15 ms, elapsed time = 1 ms.

 

SQL Server Execution Times:

CPU time = 0 ms, elapsed time = 0 ms.

 

SQL Server Execution Times:

CPU time = 0 ms, elapsed time = 0 ms.

Table '#mytemp_____________________________________________________________________________________________________________0000007C601E'. Scan count 1, logical reads 8470, physical reads 1, read-ahead reads 108, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.

 

SQL Server Execution Times:

CPU time = 78 ms, elapsed time = 87 ms.

Table '#mytemp_____________________________________________________________________________________________________________0000007C601E'. Scan count 1, logical reads 8470, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.

 

SQL Server Execution Times:

CPU time = 78 ms, elapsed time = 75 ms.

 

============================================================================================

 

Traduzindo: por cada volta no while, tivemos um IO logico de 8470 (para deletar o registro) + uma leitura fisica (no disco, o braço do HD foi até a pagina no disco magnético) e ainda precisou carregar mais 108 paginas pra memória + um novo IO de 8470 para setar o valor da variável @count, com media de tempo de processamento de 160 ms por volta

 

 

Em seguida, fiz a carga de 1.000.000 de registros criei um cursor para fazer a mesma coisa, o resultado foi:

 

============================================================================================

 

 

SQL Server Execution Times:

CPU time = 0 ms, elapsed time = 0 ms.

 

SQL Server Execution Times:

CPU time = 0 ms, elapsed time = 0 ms.

 

SQL Server Execution Times:

CPU time = 0 ms, elapsed time = 0 ms.

Table '#mytemp_____________________________________________________________________________________________________________0000007C6C7F'. Scan count 1, logical reads 8470, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.

 

SQL Server Execution Times:

CPU time = 47 ms, elapsed time = 50 ms.

Table 'Worktable'. Scan count 0, logical reads 2, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.

Table '#mytemp_____________________________________________________________________________________________________________0000007C6C7F'. Scan count 1, logical reads 1, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.

 

SQL Server Execution Times:

CPU time = 0 ms, elapsed time = 0 ms.

 

 

============================================================================================

 

Traduzindo: por cada volta no cursor, tivemos um IO de 8470 (para deletar o registro) não tivemos o IO da variavel @count pois a mesma não foi utilizada, o tempo de execução foi 50ms e consumiu menos processamento.

 

 

Resumindo... O cursor se saiu bem melhor!

 

 

declare @au_id int,@au_lname varchar(50), @au_fname varchar(50)

declare cursorteste cursor for select au_id, au_lname, au_fname from #mytemp

open cursorteste

fetch next from cursorteste into @au_id,@au_lname,@au_fname

while @@fetch_status = 0

begin

 

select @au_id, @au_lname, @au_fname

delete #mytemp where au_id = @au_id

 

 

fetch next from cursorteste into @au_id,@au_lname,@au_fname

end

close cursorteste

deallocate cursorteste

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.