1

SQL Server ストアド プロシージャでカスケード挿入を実行しています。SCOPE_IDENTITY次に、最初のテーブル挿入の ID から 2 番目のテーブルに渡します。

しかし、ストアド プロシージャの実行中に、次の NULL 値を取得しますSCOPE_IDENTITY

メッセージ 515、レベル 16、状態 2、プロシージャ InsertDDM_UserProfile、行 43
列 'Filter'、テーブル '.....dbo.DDM_Dashboard' に値 NULL を挿入できません。列はヌルを許可しません。INSERT は失敗します。

質問: ストアド プロシージャが を使用して null ID を返すのはなぜSCOPE_IDENTITYですか?

これは私が作成したストアド プロシージャです。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

以下は、2 つのテーブルの構造です。

DDM_User-

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
4

2 に答える 2

2

SCOPE_IDENTITY()これは、2 番目の挿入時に、とは関係ありません。

INSERT INTO [dbo].[DDM_Dashboard] ([Dashboard_Name], [DDM_USER_ID])
VALUES (@p_dashboardName, SCOPE_IDENTITY())

[Dashboard_Name]と の 2 つの列にのみ挿入しています[DDM_USER_ID]。column の値を指定していないため[Filter]、エラー メッセージから null 値が許可されないため、挿入が失敗します。

于 2016-11-09T16:37:59.090 に答える
1
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が指摘したように、これは実際には外部キー制約のため、問題に対する有効な解決策ではありません. ただし、他のシナリオでは、これは両方のレコードのアトミック操作であるため、カスケード挿入と更新を処理する便利な方法です。

于 2016-11-09T16:47:52.123 に答える