2015-05-19 5 views
2

Я работаю над хранимой процедурой, которая должна быть повторно вставлена ​​в таблицу с столбцом идентификации. Для этого для некоторых строк необходимо указать столбец идентификатора, для некоторых других предпочтительным будет новое значение идентификации, которое будет создано столбцом идентификации. Возможно ли это сделать в одном заявлении вместо IF-ELSE?Как выбрать IDENTITY_INSERT или предоставить его в одном заявлении

Здесь решение у меня сейчас (где id_column есть столбец идентификаторов):

DECLARE @id_to_insert INT, @val1 INT, @val2 INT, @val3 INT, @val4 INT; 

-- Do some things 

IF @id_to_insert IS NOT NULL 
BEGIN 
    SET IDENTITY_INSERT dbo.table1 ON; 

    INSERT INTO dbo.table1 (id_column, col1, col2, col3, col4, col4) 
    VALUES (@id_to_insert, @val1, @val2, @val3, @val4); 

    SET IDENTITY_INSERT dbo.table1 OFF; 
END 
ELSE 
BEGIN 
    INSERT INTO dbo.table1 (col1, col2, col3, col4, col4) 
    VALUES (@val1, @val2, @val3, @val4); 
END 

Как вы можете видеть, что оба утверждения очень похожи, было бы интересно, чтобы не пришлось повторять почти то же самое вставить.

EDIT:

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

+0

Уверен, что у меня нет проблем с тем, чтобы включить или выключить 'IDENTITY_INSERT', это была идея, которую я имел, но не могу заставить часть INSERT работать в обеих ситуациях в одном запросе. – MaxiWheat

+1

То, что у вас есть, прекрасно написано, чтобы делать то, что вы просите. Реальный вопрос заключается в том, как вы можете переделать свою базу данных, чтобы в первую очередь избежать вставки идентификаторов. Вставка идентификатора требует, чтобы пользователи владели таблицей или имели альтернативное разрешение на таблицу, что не рекомендуется давать общим пользователям. Функция вставки идентификатора существует, чтобы разрешить миграцию данных и, как правило, должна использоваться только в режиме обслуживания, а не в том, что должно происходить как обычное явление. Добавьте контекст к вашему вопросу и, возможно, мы сможем помочь вам устранить эту проблему. –

+0

@BrianPressler Я отредактировал мой вопрос с дополнительной информацией по контексту – MaxiWheat

ответ

1

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

Не могли бы вы добавить поле ActiveFlag в свой стол? Затем вы можете создать кластеризованный индекс на (ActiveFlag, id_column). Это даст вам преимущество разделения данных для быстрого доступа к новым и старым данным. У вас также не было бы всех накладных расходов на перемещение данных между таблицами по мере их истечения или омоложения; это всего лишь обновление поля для флага. Сохранение двух отдельных таблиц похоже на то, что добавляет больше работы для мало пользы.

0

О ближайшем что вы можете сделать что-то вроде этого psuedocode:

IF @id_to_insert IS NULL 
    SET @id_to_insert = SELECT [the next identity value] FROM MyTable; 

SET IDENTITY_INSERT dbo.table1 ON; 

INSERT INTO dbo.table1 (id_column, col1, col2, col3, col4, col4) 
VALUES (@id_to_insert, @val1, @val2, @val3, @val4); 

SET IDENTITY_INSERT dbo.table1 OFF; 

И вы, вероятно, необходимы использовать транзакцию для обработки проблем параллелизма.

+0

Я не уверен, что вы имеете в виду. Удаление свойства идентификации? Я предполагаю, что в таблице требуются другие входные точки. –