Scope_identity () в пакетных командах sqlclient - PullRequest
1 голос
/ 13 марта 2012

Я обычно использую хранимую процедуру при вставке записей, чтобы убедиться, что получаю правильное значение scope_identity (). У меня есть требование получить поле идентификатора вставленной записи при использовании SqlClient.

Насколько я понимаю, если я объединю команду scope_identity () со вставкой, то она все равно будет в той же области, что и команда вставки? Что-то вроде ниже. Трудно проверить, хотя ... Получу ли я 100% правильное значение идентификатора с этим ..?

(поле id - это автоинкрементный bigint - Sql Server)

long newid = 0;

using (SqlConnection conn = new SqlConnection(....))
{
    conn.Open();
    using (SqlCommand comm = new SqlCommand ("insert into .... ; select SCOPE_IDENTITY();", conn))
    {
        SqlDataReader reader = comm.ExecuteReader();
        if (reader.HasRows)
        {
            reader.Read();
            newid = Convert.ToInt64(reader[0]);
        }
    }
}

1 Ответ

3 голосов
/ 13 марта 2012

Из документации на SCOPE_IDENTITY (акцент мой):

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

В этом случае ваша команда:

"insert into .... ; select SCOPE_IDENTITY();"

Является пакетом, и, следовательно, вы получите последнее вставленное значение идентификатора в этом пакете, которое в данном случае является значением идентификатора во вставке, поскольку это единственный другой оператор в пакете.

...