Bật Microsoft SQL Server 2012 (SP1) - 11.0.3000.0 (X64)
, có cách nào để xem SQL Server sử dụng cơ chế nào để tính các giá trị nhận dạng mới cho các bảng được tạo bởi SELECT INTO
không?
DỮ LIỆU MẪU
-- Create our base table
CREATE TABLE dbo.A
(A_ID INT IDENTITY(1, 1),
x1 INT,
noise1 int DEFAULT 1,
noise2 char(1) DEFAULT 'S',
noise3 date DEFAULT GETUTCDATE(),
noise4 bit DEFAULT 0);
-- Create random data between the range of [0-3]
INSERT INTO dbo.A(x1)
SELECT s1000.n FROM
( SELECT TOP (10) n = 1 FROM sys.columns) AS s10 -- 10
CROSS JOIN
( SELECT TOP (10) n = 1 FROM sys.columns) AS s100 -- 10 * 10
CROSS JOIN
( SELECT TOP (10) n = ABS(CHECKSUM(NEWID())) % 4 FROM sys.columns) AS s1000; -- 100 * 10
SELECT * FROM dbo.A ORDER BY A_ID DESC;
Trong trường hợp của tôi, kết quả là:
Và chạy
DBCC CHECKIDENT('A')
trả lại
Kiểm tra thông tin nhận dạng: giá trị nhận dạng hiện tại '1000', giá trị cột hiện tại '1000'.
Tạo bảng mới
Khi chúng ta chọn một tập hợp con vào một bảng mới, nó sẽ tạo ra một giá trị nhận dạng hiện tại mới:
SELECT * INTO #temp FROM dbo.A WHERE x1 = 0;
Giá trị cao nhất trong cột danh tính của bảng mới này là 998 và khi chúng tôi kiểm tra danh tính tiếp theo:
DBCC CHECKIDENT('#temp')
Kiểm tra thông tin nhận dạng: giá trị nhận dạng hiện tại '998', giá trị cột hiện tại '998'.
Làm sao?
Làm thế nào các giá trị nhận dạng này được chèn vào bảng mới với giá trị cao nhất được đặt chính xác làm giá trị nhận dạng hiện tại của bảng mới?