none
Pegar registros inseridos após insert RRS feed

  • Pergunta

  • Olá amigos, como posso pegar várias chaves primárias após um insert usando select? algo como 

    INSERT INTO TABLE

    SELECT ITEM1, ITEM2 FROM TABLE2

    Como obter essas chaves primárias após este insert? geralmente uso o SCOPE_IDENTITY, mas após um registro só.

    Abs


    Se for útil marque como tal, se for a resposta, marque-a também. Procure ajudar a quem mais precisa
    sexta-feira, 30 de abril de 2010 16:55

Respostas

  • Ricardo,

    Acredito que com o OUTPUT ainda podemos chegar em uam possivel solução
    No cas oda tabela temporária foi so servir como exemplo, mas vc pode substuir pela tabela, pois vc consegue pegar o identity, alterei o script (adicionei uma coluna identity na tabela destino) verifique que eu o tenho na tabela output

    create table #tbTeste (id int, cod int, nome varchar(10), constraint pk_tbTeste primary key clustered(id,cod))
    create table #tbTesteDestino (id int identity (1,1) , cod int, nome varchar(10))
    go
    insert into #tbTeste values(10,10,'Marcelo')
    insert into #tbTeste values(20,20,'Camila')
    insert into #tbTeste values(30,11,'Fernandes')
    insert into #tbTeste values(40,21,'SPFC')
    go
    DECLARE @TableOutput table( id int,cod int);
    
    INSERT #tbTesteDestino (cod,nome)
      OUTPUT INSERTED.id, INSERTED.cod INTO @TableOutput
    select cod,nome from #tbTeste
    
    select * from @TableOutput
    go
    drop table #tbTeste
    drop table #tbTesteDestino

    Att.
    Marcelo Fernandes


    MCP, MCDBA, MCSA, MCTS. Se útil, classifique!!!
    • Marcado como Resposta Ricardo D. Beck sexta-feira, 30 de abril de 2010 21:33
    sexta-feira, 30 de abril de 2010 20:20
    Moderador

Todas as Respostas

  • Ricardo,

    Qual a versãodo seu SQL Server?

    att.
    Marcelo Fernandes


    MCP, MCDBA, MCSA, MCTS. Se útil, classifique!!!
    sexta-feira, 30 de abril de 2010 18:45
    Moderador
  • Oi Ricardo,

    Você pode criar uma trigger para o insert dessa tabela, que insere as chves inseridas em uma outra tabela, e buscar dessa outra tabela.

    Isso serviria pro seu cenário?


    Latino
    sexta-feira, 30 de abril de 2010 19:14
  • Tenho uma ideia um pouco melhor se seu SQL for 2005 ou 2008

    segue:

    create table #tbTeste (id int, cod int, nome varchar(10), constraint pk_tbTeste primary key clustered(id,cod))
    create table #tbTesteDestino (id int, cod int, nome varchar(10), constraint pk_tbTesteDest primary key clustered(id,cod))
    go
    insert into #tbTeste values(1,1,'Marcelo')
    insert into #tbTeste values(2,2,'Camila')
    insert into #tbTeste values(3,1,'Fernandes')
    insert into #tbTeste values(4,2,'SPFC')
    go
    DECLARE @TableOutput table( id int,cod int);
    
    INSERT #tbTesteDestino
      OUTPUT INSERTED.id, INSERTED.cod INTO @TableOutput
    select * from #tbTeste
    
    select * from @TableOutput
    go
    drop table #tbTeste
    drop table #tbTesteDestino

    att.
    Marcelo Fernandes


    MCP, MCDBA, MCSA, MCTS. Se útil, classifique!!!
    sexta-feira, 30 de abril de 2010 19:31
    Moderador
  • Oi Ricardo,

    Você pode criar uma trigger para o insert dessa tabela, que insere as chves inseridas em uma outra tabela, e buscar dessa outra tabela.

    Isso serviria pro seu cenário?


    Latino
    Acontece que tenho duas tabelas: TABELA1 TABELA2, na tabela 1 preciso inserir uma campanha, que vai levando o nome do cliente que precisa ser inserido na TABELA2, pois os dados recebo num XML. Então eu preciso da chave primária da tabela1 após a inserção para que com base neste valor eu possa inserir com este ID na tabela2. Com a trigger eu consigo, mas não tenho acesso ao nome do cliente que veio na procedure anterior que faz este insert já que na tabela1 não tem o nome do cliente.
    Se for útil marque como tal, se for a resposta, marque-a também. Procure ajudar a quem mais precisa
    sexta-feira, 30 de abril de 2010 20:07
  • Tenho uma ideia um pouco melhor se seu SQL for 2005 ou 2008

    segue:

    create table #tbTeste (id int, cod int, nome varchar(10), constraint pk_tbTeste primary key clustered(id,cod))
    create table #tbTesteDestino (id int, cod int, nome varchar(10), constraint pk_tbTesteDest primary key clustered(id,cod))
    go
    insert into #tbTeste values(1,1,'Marcelo')
    insert into #tbTeste values(2,2,'Camila')
    insert into #tbTeste values(3,1,'Fernandes')
    insert into #tbTeste values(4,2,'SPFC')
    go
    DECLARE @TableOutput table( id int,cod int);
    
    INSERT #tbTesteDestino
     OUTPUT INSERTED.id, INSERTED.cod INTO @TableOutput
    select * from #tbTeste
    
    select * from @TableOutput
    go
    drop table #tbTeste
    drop table #tbTesteDestino
    

    att.
    Marcelo Fernandes


    MCP, MCDBA, MCSA, MCTS. Se útil, classifique!!!

    Olá Marcelo, obrigado por sua resposta, mas não posso levar em conta a chave primária de uma tabela temporária, já que neste caso a tabela da campanha já tem as chaves definidas, ou seja, tenho que dar sequenciamento as chaves já existentes.

    Abs


    Se for útil marque como tal, se for a resposta, marque-a também. Procure ajudar a quem mais precisa
    sexta-feira, 30 de abril de 2010 20:09
  • Ricardo,

    Qual a versãodo seu SQL Server?

    att.
    Marcelo Fernandes


    MCP, MCDBA, MCSA, MCTS. Se útil, classifique!!!

    A versão é Sql Standard 2008.

    Abs


    Se for útil marque como tal, se for a resposta, marque-a também. Procure ajudar a quem mais precisa
    sexta-feira, 30 de abril de 2010 20:10
  • Ricardo,

    Acredito que com o OUTPUT ainda podemos chegar em uam possivel solução
    No cas oda tabela temporária foi so servir como exemplo, mas vc pode substuir pela tabela, pois vc consegue pegar o identity, alterei o script (adicionei uma coluna identity na tabela destino) verifique que eu o tenho na tabela output

    create table #tbTeste (id int, cod int, nome varchar(10), constraint pk_tbTeste primary key clustered(id,cod))
    create table #tbTesteDestino (id int identity (1,1) , cod int, nome varchar(10))
    go
    insert into #tbTeste values(10,10,'Marcelo')
    insert into #tbTeste values(20,20,'Camila')
    insert into #tbTeste values(30,11,'Fernandes')
    insert into #tbTeste values(40,21,'SPFC')
    go
    DECLARE @TableOutput table( id int,cod int);
    
    INSERT #tbTesteDestino (cod,nome)
      OUTPUT INSERTED.id, INSERTED.cod INTO @TableOutput
    select cod,nome from #tbTeste
    
    select * from @TableOutput
    go
    drop table #tbTeste
    drop table #tbTesteDestino

    Att.
    Marcelo Fernandes


    MCP, MCDBA, MCSA, MCTS. Se útil, classifique!!!
    • Marcado como Resposta Ricardo D. Beck sexta-feira, 30 de abril de 2010 21:33
    sexta-feira, 30 de abril de 2010 20:20
    Moderador
  • Marcelo, irei verificar e te aviso. Obrigado.
    Se for útil marque como tal, se for a resposta, marque-a também. Procure ajudar a quem mais precisa
    sexta-feira, 30 de abril de 2010 20:31
  • Marcelo meu velho obrigadão!

    Abs


    Se for útil marque como tal, se for a resposta, marque-a também. Procure ajudar a quem mais precisa
    sexta-feira, 30 de abril de 2010 21:34
  • Ricardo...

    Disponha,  OUTPUT fica esquecido de lado mais de vez em quando é útil :D

    att.
    Marcelo Fernandes


    MCP, MCDBA, MCSA, MCTS. Se útil, classifique!!!
    sexta-feira, 30 de abril de 2010 21:42
    Moderador