Ви можете використовувати приєднання, щоб створити та заповнити нову таблицю за один раз:
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 не повинна бути видалено, оскільки у наборі рядків вихідного рядка відповідно до плану запитів більше немає стовпця ІДЕНТИЧНОСТІ. Це означає, що вищезазначений запит може припинити роботу, як очікувалося,
Але, як правильно зазначає ypercubeᵀᴹ , поки що в посібнику явно було зазначено, що якщо є з'єднання, властивість IDENTITY не зберігається:
Коли в новій таблиці вибрано існуючий стовпець ідентичності, новий стовпець успадковує властивість IDENTITY, якщо [...] [t] він SELECT не містить з'єднання.
Отже, доки посібник не згадає про нього, ми можемо бути впевнені, що поведінка залишиться такою ж.
Кудос до Шанеї та йперкубеᵀᴹ для підняття відповідної теми в чаті.
JOIN (SELECT 1) AS dummy ON 1 = 1
теж працювати?