Как я могу (оба) создать строку и получить доступ к этой строке в одной и той же «хранимой процедуре»? - PullRequest
1 голос
/ 22 апреля 2010

Я бы хотел получить значение столбца id для объекта сразу после его создания.Но я не хочу запускать другой запрос для этого.В моей книге для начинающих ( SQL Server 2008 для чайников ) говорится, что есть 2 таблицы ( вставлены и удалены ), в которых содержатся последние строки, которые были вставлены, обновлены илиудален.

К сожалению, только Триггеры (говорит книга) могут получить доступ к этим таблицам.Но если я использую триггеры, они срабатывают каждый раз, когда я " вставляю " строку, даже когда мне не нужны эти функции.

Могу ли я получить тот же эффект сПроцедура сохранения (без необходимости запуска отдельного запроса?)

Это то, что я пытаюсь сделать

CREATE PROCEDURE myProcedure
DECLARE @OrganizationName
        @ColumnID OUTPUT
AS
INSERT INTO Organization (OrganizationName)
VALUES (@OrganizationName)

SET @ColumnID = (// Please, I need Help here ...)

Спасибо за помощь

Ответы [ 5 ]

5 голосов
/ 22 апреля 2010

Вы можете использовать SCOPE_IDENTITY():

SELECT @ColumnID = SCOPE_IDENTITY()
1 голос
/ 22 апреля 2010

Использование функции SCOPE_IDENTITY () :

SELECT @ColumnID = SCOPE_IDENTITY()
0 голосов
/ 22 апреля 2010

вы можете использовать предложение OUTPUT, которое имеет доступ к INSERTED и DELETED (DELETED только при обновлении / удалении):

DECLARE @NewRows table (YourIdentityColumn ....
                       ,any other columns here
                       )

INSERT INTO Organization
        (OrganizationName)
        OUTPUT INSERTED.YourIdentityColumn, any other columns here
            INTO @NewRows
    VALUES (@OrganizationName)

конечно, это лучше всего при вставке нескольких строк одновременно:

INSERT INTO Organization
        (OrganizationName)
        OUTPUT INSERTED.YourIdentityColumn, any other columns here
            INTO @NewRows
    SELECT
        col1, col2, col3...
        FROM ...

Вы также можете просто вернуть набор результатов (он вставит строку и вернет набор результатов вызывающей процедуре) из INSERT:

INSERT INTO Organization
        (OrganizationName)
        OUTPUT INSERTED.YourIdentityColumn, any other columns here
    VALUES (@OrganizationName)
0 голосов
/ 22 апреля 2010

Просто чтобы прояснить неправильное представление о триггерах. Вы можете создать триггеры "FOR UPDATE", которые будут вызывать их срабатывание только при обновлении, а не для вставки.

Но все остальные здесь правы, используйте SCOPE_IDENTITY().

Причина, по которой вы используете SCOPE_IDENTITY() вместо @@IDENTITY, заключается в том, что @@IDENTITY является глобальным для сервера, поэтому, если у вас есть триггеры, создающие запись в другой таблице с полем IDENTITY, @@IDENTITY будет содержать это значение.

SCOPE_IDENTITY() гарантирует, что вы получите идентификатор из только что вставленной таблицы.

0 голосов
/ 22 апреля 2010
SELECT @@IDENTITY;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...