Sql server 如何解决级联插入上的空范围\u标识?

Sql server 如何解决级联插入上的空范围\u标识?,sql-server,tsql,foreign-keys,scope-identity,Sql Server,Tsql,Foreign Keys,Scope Identity,我正在SQL Server存储过程中执行级联插入。然后我将SCOPE\u标识从第一个表插入的ID传递到第二个表 但是在执行存储过程期间,我得到了范围\u标识的空值: Msg 515,16级,状态2,程序插入DDM_用户配置文件,第43行 无法将值NULL插入到“Filter”列、表“……dbo.DDM_Dashboard”中;列不允许空值。插入失败 问题:为什么存储过程使用作用域标识返回空ID 这是我起草的存储过程。已经为表设置了FK约束: ALTER PROCEDURE [dbo].[Inse

我正在SQL Server存储过程中执行级联插入。然后我将
SCOPE\u标识
从第一个表插入的ID传递到第二个表

但是在执行存储过程期间,我得到了
范围\u标识的空值:

Msg 515,16级,状态2,程序插入DDM_用户配置文件,第43行
无法将值NULL插入到“Filter”列、表“……dbo.DDM_Dashboard”中;列不允许空值。插入失败

问题:为什么存储过程使用
作用域标识返回空ID

这是我起草的存储过程。已经为表设置了FK约束:

ALTER PROCEDURE [dbo].[InsertDDM_UserProfile]
   @p_email VARCHAR(100),
   @p_dashboardName VARCHAR(100),
AS 
BEGIN    
    INSERT INTO [dbo].[DDM_User] ([Email])
    VALUES (@p_email)

    INSERT INTO [dbo].[DDM_Dashboard] ([Dashboard_Name], [DDM_USER_ID])
    VALUES (@p_dashboardName, SCOPE_IDENTITY())
END
以下是两个表的结构:

DDM_用户-

CREATE TABLE [dbo].[DDM_User]
(
    [ID] [int] IDENTITY(1,1) NOT NULL,
    [Email] [varchar](80) NOT NULL,

    CONSTRAINT [PK_DDMUser] 
        PRIMARY KEY CLUSTERED ([ID] ASC)
                    WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, 
                          IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, 
                          ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
DDM_仪表板:

CREATE TABLE [dbo].[DDM_Dashboard]
(
    [ID] [int] IDENTITY(1,1) NOT NULL,
    [Dashboard_Name] [varchar](100) NOT NULL,
    [DDM_USER_ID] [int] NOT NULL,

    CONSTRAINT [PK_DDMDashboard] 
        PRIMARY KEY CLUSTERED ([ID] ASC)
                    WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, 
                          IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, 
                          ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO

ALTER TABLE [dbo].[DDM_Dashboard] WITH NOCHECK 
    ADD CONSTRAINT [FK_DDMDashboard_DDMUser] 
        FOREIGN KEY([DDM_USER_ID]) REFERENCES [dbo].[DDM_User] ([ID])
GO

ALTER TABLE [dbo].[DDM_Dashboard] CHECK CONSTRAINT [FK_DDMDashboard_DDMUser]
GO

这与第二次插入期间的
范围\u IDENTITY()
无关:

INSERT INTO [dbo].[DDM_Dashboard] ([Dashboard_Name], [DDM_USER_ID])
VALUES (@p_dashboardName, SCOPE_IDENTITY())
您只需在两列中插入
[Dashboard\u Name]
[DDM\u USER\u ID]
。您没有为列
[Filter]
指定值,该列在错误消息中不允许空值,因此插入失败

DECLARE @Value1 varchar(50) = 'Test1', @Value2 varchar(50) = 'Test2';

DECLARE @Table1 table (Id int NOT NULL IDENTITY(1,1), Value varchar(50) NOT NULL);
DECLARE @Table2 table (Id int NOT NULL, Value varchar(50) NOT NULL);

INSERT INTO @Table1 (Value1)
OUTPUT inserted.Id, @Value2 INTO @Table2 (Id, Value)
Values (@Value1)
;

SELECT * FROM @Table1;
SELECT * FROM @Table1;
编辑:
正如GarethD指出的,由于外键约束,这实际上不是问题的有效解决方案。但是,在其他情况下,这是处理级联插入和更新的有用方法,因为这是两个记录的原子操作。

我们可以看到两个表的表架构吗?DDM_仪表板上的筛选器列不允许Null,并且它不在insert语句中。当然,我现在就发布它。嗯。。。您接受了这一回答,但我没有在表架构中看到
[Filter]
列。是的,Filter列实际上仍在表中。此列的早期删除未完成,这意味着此重影列仍在表架构中。稍作解释会有所帮助。虽然我想我知道您的意思,但不幸的是,在本例中,由于外键关系,您无法使用
OUTPUT
子句直接插入到第二个表中,如果只插入一行,将
OUTPUT
与一个临时表一起使用将比只插入
SCOPE\u IDENTITY()
更加复杂。如果没有外键,或者插入多行,那么这肯定是前进的方向。