SCOPE_IDENTITY - процедура, вызывающая другую процедуру для выполнения вставки - PullRequest
1 голос
/ 18 июля 2011

У меня есть хранимая процедура (скажем, sp1), которая выполняет некоторый код, чтобы проверить, не нарушает ли переданный параметр бизнес-правила.После проверки он вызывает другую хранимую процедуру (скажем, sp2), которая фактически вставляет запись в таблицу.

У меня вопрос, могу ли я использовать SCOPE_IDENTITY в sp1, чтобы вставить IDENTITY в таблицу с помощью sp2?

Ответы [ 4 ]

4 голосов
/ 18 июля 2011

SCOPE_IDENTITY() предоставляет последний идентификатор из области, поэтому, как только SQL достигнет "GO", будет создана новая область, и вы не получите идентификатор, вы можете добавить выходной параметр на sp2 вполучить личность, которая, вероятно, является лучшим способом.

3 голосов
/ 18 июля 2011

Как говорит Йоаким, SCOPE_IDENTITY() не вернет личность после второй процедуры.Из документов MSDN на SCOPE_IDENTITY ()

Область действия - это модуль: хранимая процедура, триггер, функция или пакет.Поэтому два оператора находятся в одной и той же области видимости, если они находятся в одной и той же хранимой процедуре, функции или пакете.

@@Identity ведет себя так, как вам нужно, но имеет основной недостаток, который он поднимаетпоследний идентификатор в текущем соединении , включая триггеры .Даже если вы на 100% уверены, что на соответствующие таблицы не действуют триггеры, любой, кто добавит триггер позже, сломает это, введя сложную задачу поиска ошибки с учетом простоты использования выходного параметра, я бы действительно советовал@@Identity.

1 голос
/ 18 июля 2011

Вы создаете выходной параметр для хранения значения идентификатора, которое вы хотите в процедуре, выполняющей вставку.И подподписать его с помощью scope_identitiy или с результатами предложения output.

Затем вы создаете переменную с тем же именем в вызывающем proc и вызываете proc следующим образом:

exec @id = usp_my_proc @someinputvariable, @someotherinputvariable
0 голосов
/ 18 июля 2011

Вы всегда должны стремиться к инкапсуляции , когда это возможноНе только может SP2 возвращать новое значение идентификатора области;SP2 должен вернуть новое значение идентификатора области.Он может быть возвращен как значение RETURN или как параметр OUT.

Всегда лучше избегать глобалов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...