Bạn có thể sử dụng phép nối để tạo và điền vào bảng mới trong một lần:
SELECT
t.*
INTO
dbo.NewTable
FROM
dbo.TableWithIdentity AS t
LEFT JOIN dbo.TableWithIdentity ON 1 = 0
;
Do 1 = 0
điều kiện, phía bên phải sẽ không có kết quả trùng khớp và do đó ngăn ngừa trùng lặp các hàng bên trái và vì đây là liên kết ngoài, nên các hàng bên trái cũng sẽ không bị loại bỏ. Cuối cùng, vì đây là một tham gia, thuộc tính IDENTITY bị loại bỏ.
Do đó, chỉ chọn các cột bên trái sẽ tạo ra một bản sao chính xác của dbo.TableWithIdentity data-khôn ngoan, tức là với thuộc tính IDENTITY bị loại bỏ.
Tất cả những gì đang được nói, Max Vernon đã đưa ra một điểm hợp lệ trong một nhận xét đáng để ghi nhớ. Nếu bạn nhìn vào kế hoạch thực hiện của truy vấn trên:
bạn sẽ nhận thấy rằng bảng nguồn được đề cập trong kế hoạch thực hiện chỉ một lần. Ví dụ khác đã được loại bỏ bởi trình tối ưu hóa.
Vì vậy, nếu trình tối ưu hóa có thể thiết lập chính xác rằng bên phải của phép nối không cần thiết trong kế hoạch, thì sẽ hợp lý khi hy vọng rằng trong phiên bản tương lai của SQL Server, có thể không thể hiểu rằng thuộc tính IDENTITY không cần phải có đã bị xóa, vì không còn cột IDENTITY khác trong hàng nguồn được đặt theo kế hoạch truy vấn. Điều đó có nghĩa là truy vấn trên có thể ngừng hoạt động như mong đợi tại một số điểm.
Nhưng, như được lưu ý chính xác bởi ypercubeᵀᴹ , cho đến nay hướng dẫn đã tuyên bố rõ ràng rằng nếu có một tham gia, thuộc tính IDENTITY không được bảo tồn:
Khi một cột danh tính hiện có được chọn vào một bảng mới, cột mới sẽ kế thừa thuộc tính IDENTITY, trừ khi [...] [t] câu lệnh CHỌN của nó có chứa một phép nối.
Vì vậy, miễn là hướng dẫn sử dụng liên tục đề cập đến nó, có lẽ chúng ta có thể yên tâm rằng hành vi sẽ giữ nguyên.
Kudos đến Shaneis và ypercubeᵀᴹ vì đã đưa ra một chủ đề liên quan trong trò chuyện.
JOIN (SELECT 1) AS dummy ON 1 = 1
làm việc chứ?