2015-05-14 3 views
0

У меня проблема описана следующим образом: У меня есть таблица с одним вместо триггера вставки:Как получить идентификатор таблицы, вставленный вместо триггера вставки?

create table TMessage (ID int identity(1,1), dscp varchar(50)) 
GO 
Alter trigger tr_tmessage on tmessage 
instead of insert 
as 

--Set NoCount On 

    insert into tmessage 
    select dscp from inserted 
GO 
Alter proc P1 
As 

--Set NoCount On 

insert into tmessage 
(dscp) 
values('some data') 

Select SCOPE_IDENTITY() 

GO 

Когда я выполнить Р1 он возвращает нуль для SCOPE_IDENTITY() вместо идентичности таблицы. Я даже попробовал предложение Output в инструкции insert в proc. но снова поле вывода таблицы идентификаторов, которое заполняется из вставленного в предложение Output, равно 0.

Любая помощь будет оценена по достоинству.

+0

Вам необходимо ** показать нам триггеры! –

+0

Вы пытались @@ IDENTITY вместо scope_identity()? –

+0

Попробуйте использовать IDENT_CURRENT ('tablename') 'вместо scope_identity(). [прочитайте эту статью, чтобы узнать различия.] (http://blog.sqlauthority.com/2007/03/25/sql-server-identity-vs-scope_identity-vs-ident_current-retrieve-last-inserted-identity-of -record /) –

ответ

1

Ну, у вас есть достаточно рассол.
С одной стороны, вам нужен триггер instead of insert на вашем столе, но с другой стороны вы хотите получить личность, с которой этот триггер возвращается к хранимой процедуре, которая его активировала.

Поскольку нет никакого способа, чтобы отправить параметры и из триггеров, вы должны будете сделать одно из 3-х вещей:

  1. Найти способ, чтобы устранить необходимость в том, что вместо триггера.
    Это моя лучшая рекомендация.

  2. Перерыв хранимую процедуру на 2 части: одна часть будет делать все до insert into заявления (включая его), тем самым активируя instead of insert курок, а другая часть, которая будет делать все операции, необходимые после запуска. таким образом вы можете использовать scope_identity() внутри триггера instead of insert и отправить его возвращаемое значение ко второй хранимой процедуре в качестве параметра.
    Примечание: Этот дизайн означает, что вы должны вставлять записи по одному. если вы попытаетесь вставить более одной записи, scope_identity() вернет только идентификатор последней строки, вставленной триггером.

  3. Найдите способ передачи данных между хранимой процедурой и вместо триггера. Поскольку триггеры не могут исключать или возвращать параметры, вам придется использовать временную таблицу или обычную таблицу. Это предлагаемое решение предлагается только в качестве последнего средства, поскольку оно усложнит ваш код и, вероятно, вызовет некоторые проблемы с производительностью. Кроме того, вам нужно будет найти способ сохранить выполнение хранимой процедуры, пока вместо триггера не закончится ее работа. Я могу дать вам несколько указателей на то, как делиться данными между процедурой и триггером, но я действительно предлагаю не выбирать это решение.
+0

Спасибо за ваши комментарии. Для решения нет 1. Мы должны использовать триггер, потому что многие бизнес-коды находятся в другом триггере для этой таблицы. Мы добавили этот триггер для проверки данных перед вставкой. Если мы поместим логику в первый триггер, а в случае недопустимого события нам пришлось отбросить триггер, и это приведет к откату всего процесса. Но таким образом второй триггер только вставляется в таблицу, если данные действительны, иначе ничего не вставлено и процесс продолжается. Для no 3 я уже исправил проблему, используя временную таблицу в proc и trigger. – Jami

+0

Но, как вы сказали, я не доволен этим из-за потенциальных проблем с производительностью. Не могли бы вы подробнее рассказать о решении. В этом случае нам все равно нужно вернуть идентификатор области к первому процессу, а затем передать его другому. Как это можно сделать? – Jami

+0

Пункт решения 2 состоит в том, что вам не нужно повторно перенести идентификатор на первую процедуру, просто используйте вторую, чтобы сделать все, что вы сделали в оригинальной после вставки. –

-1

SCOPE_IDENTITY() возвращает значение из текущей области действия и является хранимой процедурой вне хранимой процедуры, это будет идентификатор null.use @@, чтобы получить последнее вставленное удостоверение.

+0

Причина использования: Прочитайте комментарии, прежде чем предлагать ответ. Кроме того, @@ identity вернет последнее значение ** любого ** тождества в базе данных дыр. не очень полезно для этой ситуации. –

+0

right.no способ получить столбец идентичности с типом идентификатора триггера и области видимости. –

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