Ошибка сценария 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 к файлу, я хочу сделать следующее:
Удалить все таблицы в БД
Создайте все таблицы (у меня есть SQL для этого)
Установите все необходимые идентификационные данные на ON
Запустите Вставки (у меня есть SQL для этого)
Установите все необходимые идентификаторы на OFF
1 ответ
- sp_MSforeachtable запустить в другом сеансе относительно вашей вставки
- В любое время только одна таблица в сеансе может иметь для свойства IDENTITY_INSERT значение ON.
Общая схема ввода исходного значения:
СОЗДАТЬ СТОЛ
УСТАНОВИТЬ ВСТАВКУ ИДЕНТИЧНОСТИ НА
ВСТАВИТЬ ЦЕННОСТИ
УСТАНОВИТЬ ВСТАВКУ ИДЕНТИЧНОСТИ ВЫКЛ
Если ваша таблица не имеет единой структуры sp_MSforeachtable, вы не подойдете