无法使用具有正常外键约束的TSQL输出?

dud*_*er4 6 t-sql

以下代码段失败并显示错误:

OUTPUT INTO子句的目标表'dbo.forn'不能位于(主键,外键)关系的任何一侧.找到参考约束'FK_forn_prim'."

我只能通过禁用外键约束来使用输出?如何才能做到这一点?

IF OBJECT_ID ('dbo.forn') IS NOT NULL
begin
    alter table dbo.forn drop constraint FK_forn_prim
    DROP TABLE dbo.forn;
end
IF OBJECT_ID ('dbo.prim') IS NOT NULL
    DROP TABLE dbo.prim;
go

CREATE TABLE dbo.prim (c1 int PRIMARY KEY);
CREATE TABLE dbo.forn (c1 int CONSTRAINT FK_forn_prim FOREIGN KEY (c1) REFERENCES dbo.prim(c1));
go

INSERT INTO dbo.prim
    OUTPUT inserted.c1 INTO dbo.forn
SELECT 1;
Run Code Online (Sandbox Code Playgroud)

HLG*_*GEM 13

通常,您输出到表变量或临时表,然后使用它来插入到最终表.


eto*_*bot 2

科技网报道

无法保证将更改应用于表的顺序与将行插入到输出表或表变量的顺序相对应。

基于此,存在许多限制,其中就是您在上面遇到的限制,但如果您想要的只是在第二个表中记录插入的值,我不明白为什么您需要您定义的外键关系多于。

如果您确实需要外键关系,您可以使用这样的触发器来完成同样的事情。

    IF OBJECT_ID ('dbo.forn') IS NOT NULL
begin
    alter table dbo.forn drop constraint FK_forn_prim
    DROP TABLE dbo.forn;
end
IF OBJECT_ID ('dbo.prim') IS NOT NULL
    DROP TABLE dbo.prim;
go

CREATE TABLE dbo.prim (c1 int PRIMARY KEY);
CREATE TABLE dbo.forn (c1 int CONSTRAINT FK_forn_prim FOREIGN KEY (c1) REFERENCES dbo.prim(c1));
go

CREATE TRIGGER InsertRecord
   ON  dbo.Prim
   AFTER Insert
AS 
BEGIN
    SET NOCOUNT ON;
    Insert into dbo.forn Select * from inserted;
END
GO

INSERT INTO dbo.prim SELECT 1;
Run Code Online (Sandbox Code Playgroud)