Ошибка сценария SQL Server sp_MSforeachtable

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

EXEC sp_MSforeachtable @command1 = "DROP TABLE ?"; 

GO

CREATE TABLE _adminServices (
    [ServiceID] INT CHECK ([ServiceID] > 0) NOT NULL IDENTITY,
    [ServiceName] NVARCHAR(255) DEFAULT NULL,
    [ManagerStaffID] INT CHECK ([ManagerStaffID] > 0) DEFAULT NULL,
    [ODMStaffID] INT CHECK ([ODMStaffID] > 0) DEFAULT NULL,
    [ReferralInactivityDays] INT DEFAULT NULL,
    [TargetSupportHours] INT DEFAULT NULL,
    [ShowInLists] SMALLINT NOT NULL DEFAULT '1',
    [RecordEntryDate] DATETIME2(0) DEFAULT NULL,
    [RecordModDate] DATETIME2(0) DEFAULT NULL,
    PRIMARY KEY ([ServiceID])
) ;

CREATE INDEX [ManagerStaffID] ON _adminServices ([ManagerStaffID]);
CREATE INDEX [ODMStaffID] ON _adminServices ([ODMStaffID]);
CREATE INDEX [ShowInLists] ON _adminServices ([ShowInLists]);

GO

EXEC sp_MSforeachtable @command1 = 'IF  (
                                            select  COUNT(TABLE_NAME)
                                            from    INFORMATION_SCHEMA.COLUMNS
                                            where   COLUMNPROPERTY(object_id(TABLE_SCHEMA+''.''+TABLE_NAME), COLUMN_NAME, ''IsIdentity'') = 1
                                            AND     TABLE_SCHEMA+''.''+TABLE_NAME = ''?''
                                        ) = 1
BEGIN
    SET IDENTITY_INSERT ? ON;
END;';

GO

INSERT INTO _adminServices (ServiceID, ServiceName, ManagerStaffID, ODMStaffID, ReferralInactivityDays, TargetSupportHours, ShowInLists, RecordEntryDate, RecordModDate) VALUES
(1, 'Service 1', 16, 18, 0, NULL, 1, '2017-07-21 11:59:56', '2017-10-25 09:38:02');

GO

Когда я выполняю вышеупомянутый скрипт в SSMS, я получаю следующую ошибку:

Сообщение 544, уровень 16, состояние 1, строка 36 Невозможно вставить явное значение для столбца идентификаторов в таблице '_adminServices', если для параметра IDENTITY_INSERT установлено значение OFF.

Кто-нибудь может сказать мне, почему?

РЕДАКТИРОВАТЬ: Моя цель заключается в следующем: у меня есть несколько таблиц и несколько вставок. Для вкладышей у меня есть сценарии. Поскольку я не хочу записывать SET IDENTITY_INSERT ON и OFF для каждой таблицы, так как у меня просто есть запросы INSERT INTO к файлу, я хочу сделать следующее:

  1. Удалить все таблицы в БД

  2. Создайте все таблицы (у меня есть SQL для этого)

  3. Установите все необходимые идентификационные данные на ON

  4. Запустите Вставки (у меня есть SQL для этого)

  5. Установите все необходимые идентификаторы на OFF

1 ответ

Решение
  1. sp_MSforeachtable запустить в другом сеансе относительно вашей вставки
  2. В любое время только одна таблица в сеансе может иметь для свойства IDENTITY_INSERT значение ON.

Общая схема ввода исходного значения:

  1. СОЗДАТЬ СТОЛ

  2. УСТАНОВИТЬ ВСТАВКУ ИДЕНТИЧНОСТИ НА

  3. ВСТАВИТЬ ЦЕННОСТИ

  4. УСТАНОВИТЬ ВСТАВКУ ИДЕНТИЧНОСТИ ВЫКЛ

Если ваша таблица не имеет единой структуры sp_MSforeachtable, вы не подойдете

Другие вопросы по тегам