Pergunta

Eu tenho duas tabelas, a primeira tem uma chave primária que é uma identidade, o segundo tem uma chave primária que não é, mas que a chave tem uma volta restrição de chave estrangeira a chave primária primeiro da tabela.

Se eu inserir um registro de cada vez que eu posso usar o SCOPE_IDENTITY para obter o valor para o pk acabou de inserir na tabela 1 que eu quero inserir na segunda tabela.

O meu problema é que tenho muitos registros provenientes de seleciona eu quero inserir em ambas as tabelas, eu não tenho sido capaz de pensar de uma maneira baseada em conjunto para fazer essas inserções.

Minha solução atual é usar um cursor, inserção na primeira tabela, obter a chave usando SCOPE_IDENTITY, inserção na segunda tabela, repita.

Am I faltando uma solução não-cursor?

Foi útil?

Solução

Sim, Olhe para a cláusula de saída em Livros online.

Outras dicas

Eu tive esse problema só esta semana: alguém tinha introduzido uma tabela com uma chave substituta sentido no esquema onde naturalmente teclas são usadas. Sem dúvida eu vou corrigir isso em breve :) até então, eu estou trabalhando em torno dela, criando uma tabela de dados para INSERT de: isso poderia ser uma tabela base permanente ou temporária ou uma tabela derivada (veja abaixo), que deve se adequar o seu desejo de uma solução baseada em conjunto de qualquer maneira. Use uma junção entre esta tabela ea tabela com a coluna IDENTITY na chave natural para descobrir os valores gerados automaticamente. Aqui está um exemplo breve:

CREATE TABLE Test1 
(
 surrogate_key INTEGER IDENTITY NOT NULL UNIQUE, 
 natural_key CHAR(10) NOT NULL CHECK (natural_key NOT LIKE '%[^0-9]%') UNIQUE
);

CREATE TABLE Test2
(
 surrogate_key INTEGER NOT NULL UNIQUE
    REFERENCES Test1 (surrogate_key), 
 data_col INTEGER NOT NULL
);

INSERT INTO Test1 (natural_key)
SELECT DT1.natural_key
  FROM (
        SELECT '0000000001', 22
        UNION ALL 
        SELECT '0000000002', 55
        UNION ALL 
        SELECT '0000000003', 99
       ) AS DT1 (natural_key, data_col);

INSERT INTO Test2 (surrogate_key, data_col)
SELECT T1.surrogate_key, DT1.natural_key
  FROM (
        SELECT '0000000001', 22
        UNION ALL 
        SELECT '0000000002', 55
        UNION ALL 
        SELECT '0000000003', 99
       ) AS DT1 (natural_key, data_col)
       INNER JOIN Test1 AS T1
          ON T1.natural_key = DT1.natural_key;
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top