Có cách nào để xem SQL Server 2012 định nghĩa danh tính mới không?


7

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 INTOkhô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à:

kết quả

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?

Câu trả lời:


14

SELECT INTO có hai giai đoạn (không thể nhìn thấy trong kế hoạch thực hiện).

Đầu tiên, nó tạo một bảng khớp với siêu dữ liệu của truy vấn được sử dụng để tạo nó. Điều này xảy ra trong một giao dịch hệ thống, do đó, bảng (trống) được tạo sẽ tiếp tục tồn tại ngay cả khi SELECT INTOđược gói trong một giao dịch người dùng được khôi phục. Vào cuối giai đoạn đầu tiên, chúng tôi có một bảng trống bao gồm một cột có tên A_ID với thuộc tính nhận dạng.

Pha thứ hai thực hiện thao tác chèn vào bảng, pha đầu tiên được tạo. Chèn này được thực hiện với IDENTITY_INSERT ngữ nghĩa, vì vậy các giá trị bản sắc từ bảng nguồn kết thúc trong đích, không thay đổi. Các giá trị cao nhất đưa vào thực tế được thiết lập như là giá trị cuối cùng sử dụng. Bạn có thể sử dụng IDENT_CURRENThoặc sys.indentity_columns để xem nó.

Không liên quan, nhưng thực tế nửa thú vị: Có một cửa sổ nhỏ giữa việc tạo bảng và bắt đầu thực hiện thao tác chèn, trong đó bảng nguồn trong truy vấn không được bảo vệ bằng khóa ổn định lược đồ. Nếu một quá trình đồng thời xảy ra để thay đổi lược đồ của bảng nguồn (sau khi mục tiêu đã được tạo, nhưng trước khi chèn bắt đầu), lỗi 539 được đưa ra:

Lược đồ thay đổi sau khi bảng mục tiêu được tạo. Chạy lại truy vấn Chọn vào.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.