Quando se utiliza a cláusula OUTPUT em tabelas físicas com foreign keys, é possível surgir problemas com as referências, mesmo que seja um INSERT em uma tabela mãe (tabela referenciada) e com OUTPUT em uma tabela filha (tabela que possui a referência), exemplo:
CREATE TABLE Categoria (
Codigo INT IDENTITY,
Descricao VARCHAR(90) NOT NULL,
CONSTRAINT PK_Categoria PRIMARY KEY (Codigo)
);
GO
CREATE TABLE Produto (
Codigo INT IDENTITY,
Categoria INT NOT NULL,
Descricao VARCHAR(90) NOT NULL,
CONSTRAINT PK_Produto PRIMARY KEY (Codigo),
CONSTRAINT FK_Produto_Categoria FOREIGN KEY (Categoria)
REFERENCES Categoria(Codigo)
);
GO
INSERT INTO Categoria
OUTPUT INSERTED.Codigo, 'Limão' INTO Produto
VALUES ('Frutas');
Msg 332, Level 16, State 1, Line 18 The target table 'Produto' of the OUTPUT INTO clause cannot be on either side of a (primary key, foreign key) relationship. Found reference constraint 'FK_Produto_Categoria'.
A melhor maneira de se tratar isso é não ter foreign keys na tabela filha e foreign keys que referenciam a tabela filha, mas também é possível desabilitar as foreign keys durante o processo, exemplo:
ALTER TABLE Produto
NOCHECK CONSTRAINT FK_Produto_Categoria;
GO
INSERT INTO Categoria
OUTPUT INSERTED.Codigo, 'Limão' INTO Produto
VALUES ('Frutas');
GO
ALTER TABLE Produto
CHECK CONSTRAINT FK_Produto_Categoria;
O problema de desabilitar as foreign keys é possibilidade de erro após a inserção e o fato do usuário que executa esta operação ter acesso de alteração da estrutura do banco de dados (ALTER TABLE).





































