2016-11-09 2 views
1

Я выполняю каскадную вставку в хранимой процедуре SQL Server. Затем я передаю SCOPE_IDENTITY из идентификатора первой вкладки таблицы во вторую таблицу.Как разрешить null Scope_Indentity в каскадной вставке?

Но во время выполнения хранимой процедуры я получаю значение NULL для SCOPE_IDENTITY:

Msg 515, Level 16, State 2, процедура InsertDDM_UserProfile, линия 43
Не удается вставить значение NULL в столбец «Фильтр ', table' ..... dbo.DDM_Dashboard '; столбец не допускает нулей. INSERT терпит неудачу.

Вопрос: почему хранимая процедура возвращает нулевой идентификатор, используя 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 

И ниже структура двух таблицы:

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_Dashboard:

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 
+1

Можем ли мы увидеть схему таблиц обеих таблиц? Столбец «Фильтр» на DDM_Dashboard не разрешает Null и не находится в вашем заявлении insert. –

+0

Конечно, я опубликую это сейчас. –

ответ

2

Это ничего общего с SCOPE_IDENTITY(), во время второй вставки:

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

Вы только вставив в две колонки [Dashboard_Name] и [DDM_USER_ID]. Вы не указываете значение для столбца [Filter], которое из вашего сообщения об ошибке не допускает нулевые значения, поэтому ваша вставка не выполняется.

+0

Хм ... Вы приняли это как ответ, но я не вижу столбец '[Filter]' в вашей схеме таблицы. –

+0

Да, столбец фильтра на самом деле оставался в таблице. Раннее падение этого столбца не закончилось, что означало, что этот столбец-призрак все еще находится в схеме таблицы. –

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 отметил, что это на самом деле не является допустимым решением вашей проблемы в связи с ограничением внешнего ключа. Однако в других сценариях это полезный способ обработки каскадных вставок и обновлений, поскольку это атомная операция обеих записей.

+1

Немного объяснений помогло бы это. Хотя я думаю, что знаю, к чему вы клоните, к сожалению, в этом случае вы не могли бы вставлять во вторую таблицу напрямую, используя предложение «OUTPUT» из-за отношения внешнего ключа, и только с одной строкой вставки было бы сложнее используйте 'OUTPUT' с временной таблицей вместо' SCOPE_IDENTITY() '. Если бы не было внешнего ключа или вставки нескольких строк, это, безусловно, было бы направлением. – GarethD

+0

Отличная точка зрения, я забыл об ограничении. – Russ

Смежные вопросы