Вы можете использовать объединение для создания и заполнения новой таблицы за один раз:
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
работать тоже?CROSS JOIN (SELECT 1)
,INNER JOIN (SELECT 1) ON 1=1
,LEFT JOIN (SELECT 1) ON 1=0
ИлиON 1=1
- нет полос Идентичность. Похоже, это должен быть объявленный или созданный объект .Попробуйте этот код ..
ISNULL
Вызов гарантирует , что новый столбец создается сNOT NULL
допустимостью пустым.источник
ISNULL()
или что+0
это делает? Или оба нужны?Просто чтобы показать другой способ:
Вы можете использовать связанный сервер .
Вы можете временно создать связанный сервер с локальным сервером, используя это:
В этот момент вы запустите
select * into
код, ссылаясь наlocalserver
четырехчастное имя связанного сервера:После этого очистите
localserver
связанный сервер с помощью этого:Или вы можете использовать
OPENQUERY
синтаксисисточник
Свойство identity не передается, если оператор select содержит соединение и т. Д.
также даст желаемое поведение (скопированного
id
столбца, чтобы не сохранятьIDENTITY
свойство. Однако, это будет иметь побочный эффект - не копировать строки вообще! (как с некоторыми другими методами), поэтому вам нужно будет сделать:(спасибо AakashM!)
источник
Самый простой способ - сделать столбец частью выражения.
Пример:
если таблица dbo.Employee имеет идентификатор для столбца ID, то в приведенном ниже примере временная таблица #t также будет иметь идентификатор IDENTITY для столбца ID.
Измените это, чтобы применить выражение к ID, и у вас #t больше не будет идентификатора в столбце ID. В этом случае мы применяем простое дополнение к столбцу ID.
Другие примеры выражений для других типов данных могут включать: convert (), конкатенация строк или Isnull ()
источник
Иногда вы хотите вставить из таблицы, где вы не знаете (или не заботитесь), был ли столбец создан с использованием IDENTITY или нет. Это может быть даже не целочисленный столбец, с которым вы работаете. В этом случае будет работать следующее:
ISNULL удалит атрибут IDENTITY из столбца, но вставит его с тем же именем и типом, что и исходный столбец, а также сделает его необнуляемым. TOP (0) создаст пустую таблицу, которую вы можете использовать для вставки выбранных строк. Вы также можете сжать таблицу перед вставкой данных, если это необходимо.
источник
удалит личность.
Недостатком является то, что это
id
становится недействительным, но вы можете добавить это ограничение.источник
Вы не
select * into
сохраняет идентичность.источник
*
.identity
собственность не всегда сохраняется, как указывали другие ответы.