none
Como realiza INSERT baseado em um WHILE? RRS feed

  • Pergunta

  • Boa tarde,

    tenho uma tabela com apenas 4 colunas:
    Cliente, Serial, Trdq, Qtd

    Preciso de uma PROC onde eu informe apenas o Cliente e quantidade, a quantia de valores INSERIDOS deve ser igual ao Qtd obviamente.
    Fiz alguns loops com WHILE, porém ficaram infinitos, ou não rodaram nada!

    No aguardo


    DBA Vini
    quarta-feira, 1 de dezembro de 2010 19:27

Respostas

  • Vinicius

    segue um exemplo com cte recursiva
    teste com a variavel = 'Marcelo' e 'Fernandes'

    declare @tbTeste table (serial int identity, Cliente varchar(20), SerialMin int)
    insert into @tbteste values('Marcelo',1)
    insert into @tbteste values('Fernandes',3)
    
    declare @qtd int,@cliente varchar(20)
    set @qtd = 4
    set @cliente = 'Marcelo'
    
    ;with cte_dados as
    (
    select serial, cliente, serialMin+1 as 'serialMin',contador=1 from @tbTeste where Cliente=@cliente
    union all
    select a.serial, a.cliente, a.serialMin+1,contador+1
    from cte_dados a
    where a.contador < @qtd
    )
    
    SELECT serial, cliente, serialMin FROM cte_dados
    where SerialMin<=SerialMin+@qtd
    
    

    Att.
    Marcelo Fernandes


    MCP, MCDBA, MCSA, MCTS.
    Se útil, classifique!!!
    Me siga no twitter: @marcelodba

    • Marcado como Resposta Vinicius Allil segunda-feira, 6 de dezembro de 2010 13:37
    quinta-feira, 2 de dezembro de 2010 18:29
    Moderador

Todas as Respostas

  • Olá Vini. Se entendi bem, segue um exemplo:

    create proc insereCliente (@cliente int, @qtde int) as
     declare @count int
     set @count = 1
     while (@count <= isnull(@qtde, 0))
     begin
      insert into tb_cliente (...) values (...)
      set @count = @count + 1
     end
     
     exec insereCliente 1, 4


    Abraços, Weslley Moura MCP - MCTS - ORA SqlExpert
    • Sugerido como Resposta Rui SantosModerator quarta-feira, 1 de dezembro de 2010 22:31
    • Marcado como Resposta Vinicius Allil quinta-feira, 2 de dezembro de 2010 10:03
    • Não Marcado como Resposta Vinicius Allil quinta-feira, 2 de dezembro de 2010 12:41
    quarta-feira, 1 de dezembro de 2010 19:43
  • Obrigado!

    Funcionou!


    DBA Vini
    quarta-feira, 1 de dezembro de 2010 20:10
  • Pode usar essa ferramenta para gerar massa de dados...

     

    http://www.generatedata.com

    quarta-feira, 1 de dezembro de 2010 20:20
  • Desculpe, tem como me tirar mais uma dúvida?

    Tenho uma coluna que é a Serial (IDENTITY), até ai tranquilo.
    Há uma outra coluna SerialMin, está por sua vez deve ser incrementada de 1 em 1 porém baseado no Cliente.

    Exemplo se o ClienteA tem SerialMin de 5 ao inputar 4 registros com o Loop criado, a coluna SerialMin deve receber 6,7,8,9 e todas as Qtde serão 4 mesmo!
    Quando dorem imputados dados no ClienteB com SerialMin igual a 1, deve partir a contagem do 1.

    desculpe a confusão!

    Abraços


    DBA Vini
    quinta-feira, 2 de dezembro de 2010 12:23
  • Vinicius, acompanhe a execução destes comandos e verifique se é o que você precisa.

    create table cliente
    (
     cod_cliente int,
     serialMin int
    )
    insert into cliente values (1,5), (2,50)
    create table cliente_detalhe
    (
     cod_cliente int,
     serial int,
     qtde int
    )
    go
    create proc insereCliente (@cliente int, @qtde int) as
     --declara variáveis
     declare @count int
     declare @serialMin int
     
     --seta variáveis
     set @count = 1
     select @serialMin = serialMin from cliente where cod_cliente = @cliente
     
     --lógica para inserir conforme a quantidade definida
     while (@count <= isnull(@qtde, 0))
     begin
      insert into cliente_detalhe (cod_cliente, serial, qtde) values (@cliente, @serialMin, @qtde)
      set @count = @count + 1
      set @serialMin = @serialMin + 1
     end
     
     --atualiza serialMin da tabela cliente (com o próximo número da sequencia a ser usado)
     update cliente set serialMin = @serialMin where cod_cliente = @cliente
     
     go
     
     --executa a procedure
     exec insereCliente 1, 4
     
     --verifica os resultados
     select * from cliente
     select * from cliente_detalhe

    Abraços, Weslley Moura MCP - MCTS - ORA SqlExpert
    quinta-feira, 2 de dezembro de 2010 13:08
  • Veja, desculpa a nomenclatura, estava trabalhando uma genérica para não tomar seu tempo.
    IdMember = Cliente
    SerialMin = TRDQ#

    Ficou assim o código, porém está inserindo NULL no meu "SerialMin"

    ALTER

     

    PROC spInsereSerial

    @IdMember

    INT,
    @Qtde INT

    AS

    DECLARE

     

    @count INT, @TRDQ# INT
    SET
    @count = 1
    SELECT @TRDQ# = @TRDQ# FROM VoucherSerial WHERE IdMember = @IdMember
    WHILE (@count <= ISNULL(@qtde,0))
    BEGIN
    INSERT VoucherSerial VALUES (@IdMember, @TRDQ#, @Qtde)
    SET @count = @count + 1
    SET @TRDQ# = @TRDQ# + 1
    UPDATE VoucherSerial SET TRDQ# = @TRDQ# WHERE IdMember = @IdMember

    END

    GO

    -- exec spInsereSerial 500313, 4

    onde: 500313 = IdMember e 4 = Qtde


    DBA Vini
    quinta-feira, 2 de dezembro de 2010 13:49
  • Qual versão do SQL?

    att.
    Marcelo Fernandes


    MCP, MCDBA, MCSA, MCTS.
    Se útil, classifique!!!
    Me siga no twitter: @marcelodba

    quinta-feira, 2 de dezembro de 2010 13:54
    Moderador
  • 2008 express


    DBA Vini
    quinta-feira, 2 de dezembro de 2010 15:05
  • Vinicius

    segue um exemplo com cte recursiva
    teste com a variavel = 'Marcelo' e 'Fernandes'

    declare @tbTeste table (serial int identity, Cliente varchar(20), SerialMin int)
    insert into @tbteste values('Marcelo',1)
    insert into @tbteste values('Fernandes',3)
    
    declare @qtd int,@cliente varchar(20)
    set @qtd = 4
    set @cliente = 'Marcelo'
    
    ;with cte_dados as
    (
    select serial, cliente, serialMin+1 as 'serialMin',contador=1 from @tbTeste where Cliente=@cliente
    union all
    select a.serial, a.cliente, a.serialMin+1,contador+1
    from cte_dados a
    where a.contador < @qtd
    )
    
    SELECT serial, cliente, serialMin FROM cte_dados
    where SerialMin<=SerialMin+@qtd
    
    

    Att.
    Marcelo Fernandes


    MCP, MCDBA, MCSA, MCTS.
    Se útil, classifique!!!
    Me siga no twitter: @marcelodba

    • Marcado como Resposta Vinicius Allil segunda-feira, 6 de dezembro de 2010 13:37
    quinta-feira, 2 de dezembro de 2010 18:29
    Moderador