Вы можете использовать объединение для создания и заполнения новой таблицы за один раз:
SELECT
t.*
INTO
dbo.NewTable
FROM
dbo.TableWithIdentity AS t
LEFT JOIN dbo.TableWithIdentity ON 1 = 0
;
Из-за этого 1 = 0
условия правая сторона не будет иметь совпадений и, таким образом, предотвратит дублирование строк левой стороны, а поскольку это внешнее соединение, строки левой стороны также не будут удалены. Наконец, поскольку это соединение, свойство IDENTITY исключается.
Таким образом, выбор только левых боковых столбцов даст точную копию только для данных dbo.TableWithIdentity , т. Е. С удаленным свойством IDENTITY.
Все это, как говорится, Макс Вернон поднял обоснованный момент в комментарии, который стоит иметь в виду. Если вы посмотрите на план выполнения вышеуказанного запроса:
вы заметите, что исходная таблица упоминается в плане выполнения только один раз. Другой экземпляр был устранен оптимизатором.
Таким образом, если оптимизатор может правильно установить, что правая сторона объединения не требуется в плане, разумно ожидать, что в будущей версии SQL Server он сможет определить, что свойство IDENTITY необязательно либо удален, так как больше нет другого столбца IDENTITY в исходной строке, установленной в соответствии с планом запроса. Это означает, что приведенный выше запрос может перестать работать, как ожидалось, в какой-то момент.
Но, как правильно заметил ypercubeᵀᴹ , до сих пор в руководстве явно указывалось, что при наличии соединения свойство IDENTITY не сохраняется:
Когда существующий столбец идентификаторов выбирается в новую таблицу, новый столбец наследует свойство IDENTITY, если только [...] [t] инструкция SELECT не содержит соединение.
Так что, пока руководство продолжает упоминать об этом, мы можем быть уверены, что поведение останется прежним.
Престижность Shaneis и ypercubeᵀᴹ за обсуждение связанной темы в чате.
JOIN (SELECT 1) AS dummy ON 1 = 1
работать тоже?