вставить, затем выбрать scope_identity () генерирует повторяющиеся строки - PullRequest
0 голосов
/ 21 апреля 2011
CREATE TABLE [schema].[table] (
  [column1] int IDENTITY NOT NULL,
  [column2] int NULL,
  [column3] int NULL,
  PRIMARY KEY CLUSTERED ([column1])
);
INSERT INTO schema.table (column2,column3) VALUES (1,1);
SELECT scope_identity();

он вставляет ДВЕ идентичные строки и возвращает первичный ключ для второй вставленной строки.

Это, вероятно, очень простая причина, но Google не является моим другом в этом.

1 Ответ

5 голосов
/ 21 апреля 2011

Пожалуйста, скопируйте и вставьте дословно

SET NOCOUNT ON;
USE tempdb;
CREATE TABLE dbo.[table] (
  [column1] int IDENTITY NOT NULL,
  [column2] int NULL,
  [column3] int NULL,
  PRIMARY KEY CLUSTERED ([column1])
);
INSERT INTO dbo.[table] (column2,column3) VALUES (1,1);
SELECT scope_identity();

SELECT * FROM dbo.[table]

Вы должны получить

---------------------------------------
1

column1     column2     column3
----------- ----------- -----------
1           1           1

Если есть сомнения, всегда примеряйте новую чистую таблицу в базе данных tempdb.

Другие примечания:

  • Если вы запускаете вставку из ASP.Net, проверьте, есть ли у вас пустые элементы CSS (ссылка на фоновое изображение), это вызывает второй запрос на ту же страницу
  • Если вы используете простую INSERT в SSMS или аналогичном инструменте, проверьте наличие триггеров

Чтобы найти триггеры для таблицы, используя TSQL

select name, OBJECT_NAME(parent_object_id)
from sys.objects
where type='TR'
and OBJECT_NAME(parent_object_id) = 'table'  -- or whatever the table name is

Для просмотра текста триггера (или любого модуля) с помощью TSQL

select definition
from sys.sql_modules
where object_id = object_id('tg_table')  -- or whatever the trigger is named
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...