При использовании функции @@ IDENTITY и SCOPE_IDENTITY() может появиться неверные значения

Переводы статьи Переводы статьи
Закрыть Закрыть
Код статьи: 2019779 - Vizualiza?i produsele pentru care se aplic? acest articol.
Развернуть все | Свернуть все

Проблема

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

Причина

Корпорация Майкрософт подтверждает, что это проблема в продуктах Microsoft, перечисленных в начале данной статьи.

Решение

В настоящее время нет никаких исправление, устраняющее эту проблему. Корпорация Майкрософт рекомендует не использовать любой из этих функций в запросах при использовании параллельных планов, они не всегда надежный. Вместо этого используйте предложение OUTPUT инструкции INSERT для извлечения значения идентификаторов, как показано в следующем примере.

Пример использования предложения OUTPUT.

ОБЪЯВЛЕНИЕ таблицы @ MyNewIdentityValues (myidvalues int)
Объявление таблицы @ A (идентификатор типа int первичный ключ)
Вставьте значения @ A (1)
Объявление таблицы @ B (int identity(1,1) первичного ключа Идентификатора, int b не null)
Вставьте значения @ B (1)
Выберите
[Количество строк] = @@ RowCount,
[@@ IDENTITY] = @@ IDENTITY,
[SCOPE_IDENTITY] = SCOPE_IDENTITY()

SET statistics profile на
Вставка в _ddr_T
выходные данные вставлены.Идентификатор в @ MyNewIdentityValues
Выберите
b.ID
от @ A
left join @ B b на b.ID = 1
левое объединение @ B b2 на b2.B = -1

left join _ddr_T t на t.T = -1

где не существует (выберите * из _ddr_T t2 где t2.ID = -1)
SET statistics profile off

Выберите
[Количество строк] = @@ RowCount,
[@@ IDENTITY] = @@ IDENTITY,
[SCOPE_IDENTITY] = SCOPE_IDENTITY(),
[IDENT_CURRENT] = IDENT_CURRENT('_ddr_T')
Выберите * от @ MyNewIdentityValues
Перейти

Если ситуации требуется, необходимо использовать любой из этих функций, можно использовать один из следующих методов для обхода проблемы.

Метод 1:

Включить следующий параметр в запрос

OPTION (MAXDOP 1)

Примечание: это может привести к снижению производительности части запроса SELECT.

Способ 2:

Прочитать значение из части SELECT в набор переменных (или одной табличной переменной), а затем вставить в целевую таблицу с MAXDOP = 1. Так как не будет параллельного плана вставки вы получите право семантических еще ваш выбор будет параллельных требуемый уровень производительности.

Способ 3:

Выполните следующую инструкцию, чтобы установить параметр max degree of parallelism 1:

sp_configure «max degree of parallelism», 1
Перейти
изменить параметры с помощью переопределения
Перейти

Примечание: Этот метод может вызвать снижение производительности на сервере. Этот метод не следует использовать, если только он оценен в тестирования, или промежуточной, среда.

Дополнительная информация

Примечание. Это ЭКСПРЕСС-ПУБЛИКАЦИЯ, подготовленная непосредственно службой технической поддержки Майкрософт . Сведения, содержащиеся в данном документе, предоставлены в качестве отклика на возникшие проблемы. Из-за срочности в материалах могут быть опечатки, и в любое время и без уведомления в них могут быть внесены изменения. Чтобы получить дополнительные сведения, см. Условия использования.

Свойства

Код статьи: 2019779 - Последний отзыв: 30 мая 2011 г. - Revision: 8.0
Информация в данной статье относится к следующим продуктам.
  • Microsoft SQL Server 2005 Developer Edition
  • Microsoft SQL Server 2008 Developer
  • Microsoft SQL Server 2008 Enterprise
  • Microsoft SQL Server 2008 R2 Developer
  • Microsoft SQL Server 2008 R2 Enterprise
  • Microsoft SQL Server 2005 Enterprise Edition
  • Microsoft SQL Server 2005 Evaluation Edition
  • Microsoft SQL Server 2005 Standard Edition
  • Microsoft SQL Server 2008 Standard
  • Microsoft SQL Server 2008 Workgroup
  • Microsoft SQL Server 2008 Web
  • Microsoft SQL Server 2008 Standard Edition for Small Business
  • Microsoft SQL Server 2008 R2 Standard
  • Microsoft SQL Server 2008 R2 Web
  • Microsoft SQL Server 2005 Workgroup Edition
  • Microsoft SQL Server 2005 Enterprise X64 Edition
Ключевые слова: 
kbmt KB2019779 KbMtru
Переведено с помощью машинного перевода
ВНИМАНИЕ! Перевод данной статьи был выполнен не человеком, а с помощью программы машинного перевода, разработанной корпорацией Майкрософт. Корпорация Майкрософт предлагает вам статьи, переведенные как людьми, так и средствами машинного перевода, чтобы у вас была возможность ознакомиться со статьями базы знаний KB на родном языке. Однако машинный перевод не всегда идеален. Он может содержать смысловые, синтаксические и грамматические ошибки, подобно тому как иностранец делает ошибки, пытаясь говорить на вашем языке. Корпорация Майкрософт не несет ответственности за неточности, ошибки и возможный ущерб, причиненный в результате неправильного перевода или его использования. Корпорация Майкрософт также часто обновляет средства машинного перевода.
Эта статья на английском языке:2019779

Отправить отзыв

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com