Definir inserção com base em duas tabelas com 1 a 0-1 relação
-
06-07-2019 - |
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?
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;