Trường hợp SQL Server thực sự lưu trữ GIÁ TRỊ IDENTITY cho một bảng?


12

Tôi hy vọng ai đó có thể chỉ cho tôi đi đúng hướng về điều này. Đây là hoạt động của tôi cho đến nay.

SELECT * FROM sys.identity_columns là chế độ xem hệ thống cung cấp "last_value" nhưng định nghĩa cho chế độ xem đó sử dụng chức năng bên trong IdentityProperty(colName, 'LastValue') - vì vậy đó là một ngõ cụt (không kéo nó từ một bảng hệ thống ở đó).

Ở mọi nơi (tôi đã xem) trên internet đề xuất sử dụng DBCC IDENT_... các lệnh để khám phá giá trị nhưng điều đó vẫn khiến tôi chìm trong bóng tối như nơi nó thực sự được lưu trữ.

Vì vậy, tôi đã tìm kiếm các trang cá nhân với DBCC PAGE(TestDB,1,1325,3) dựa trên db khai thác thử nghiệm của mình và sử dụng RESEEDlệnh để chuyển đổi giữa các giá trị 10 và 12.

Bằng cách này, tôi nhận thấy các giá trị hex trên IAM: Header, IAM: Single Page AllocationsIAM: Extent Alloc Status Slot 1tất cả đã thay đổi. (Và nhận ra dù sao họ cũng thay đổi theo định kỳ cùng với bUse1 giá trị cũng thay đổi theo từng bước).

Vì vậy, một ngõ cụt khác và tôi hết ý tưởng. Tôi có thể tìm kiếm ở đâu nữa?

Tôi đang chạy SQL Server 2014. Tôi có một khát khao vô tận đối với kiến ​​thức bên trong và chưa gặp phải bất cứ điều gì khó nắm bắt như thế này. Nó thu hút sự chú ý của tôi bởi vì về lý thuyết, nó (một giá trị tuyệt đối) được lưu trữ ở đâu đó và nên (có thể nói là) có thể định vị được. Trong nhiệm vụ tìm kiếm vị trí khai quật dữ liệu / dữ liệu meta được lưu trữ nội bộ, giá trị đặc biệt này khiến tôi đặc biệt khó nắm bắt. Tôi đoán / hy vọng rằng ai đó sẽ đi cùng và nói với tôi, bạn có thể lấy nó DBCC PAGEnhưng tôi đã nhìn nhầm chỗ.

Câu trả lời:


8

Nếu bạn có thể truy cập vào DAC ( Bảng điều khiển dành cho quản trị viên chuyên dụng ), bạn có thể kiểm tra giá trị của cột nhận dạng, cho INTcác cột, bằng cách xem idtvalcột trongsys.syscolpars .

Cảm ơn Martin Smith đã hướng dẫn tôi đến bảng đó thông qua câu trả lời rất hữu ích này của Roi Gavish về một câu hỏi liên quan ở đây.

Lấy ví dụ, bảng tạm thời sau đây:

USE tempdb;

CREATE TABLE #d
(
    ID INT NOT NULL IDENTITY(1,1)
);

TRUNCATE TABLE #d;

DBCC CHECKIDENT ('#d',RESEED, 2147483635);

INSERT INTO #d DEFAULT VALUES;

Hãy xem bảng chứa gì:

SELECT *
FROM #d;
+------------+
| ID         |
+------------+
| 2147483635 |
+------------+

Giá trị nhận dạng có thể được kiểm tra bằng mã này:

DECLARE @idtval VARBINARY(64);

SELECT @idtval = scp.idtval
FROM sys.syscolpars scp
    INNER JOIN sys.objects o ON scp.id = o.object_id
WHERE o.name LIKE '#d____%'

DECLARE @LittleEndian NVARCHAR(10);
SET @LittleEndian = LEFT(sys.fn_varbintohexstr(@idtval), 10);
SELECT @LittleEndian;
DECLARE @BigEndian NVARCHAR(10) = '0x';
DECLARE @Loop INT = 0;
WHILE @Loop < 4
BEGIN
  SET @BigEndian = @BigEndian + SUBSTRING(@LittleEndian, ((4 - @Loop) * 2) + 1, 2);
  SET @Loop += 1;
END
SELECT CurrentIdentityValue = CONVERT(INT, 
    CONVERT(VARBINARY(32), @BigEndian, 1), 2);
+----------------------+
| CurrentIdentityValue |
+----------------------+
|                      |
| 2147483635           |
+----------------------+

Dành cho BIGINT các cột định danh, chúng ta cần mở rộng kích thước của một số biến được sử dụng trong mã, chẳng hạn như:

CREATE TABLE #dBig
(
    ID BIGINT NOT NULL IDENTITY(1,1)
);

TRUNCATE TABLE #dBig;

DBCC CHECKIDENT ('#dBig',RESEED, 9223372036854775704);

INSERT INTO #dBig DEFAULT VALUES;

SELECT *
FROM #dBig;


DECLARE @idtval VARBINARY(64);

SELECT @idtval = scp.idtval
FROM sys.syscolpars scp
    INNER JOIN sys.objects o ON scp.id = o.object_id
WHERE o.name LIKE '#dBig____%'

DECLARE @LittleEndian NVARCHAR(18);
SET @LittleEndian = LEFT(sys.fn_varbintohexstr(@idtval), 18);
DECLARE @BigEndian NVARCHAR(18) = '0x';
DECLARE @Loop INT = 0;
WHILE @Loop < 8
BEGIN
  SET @BigEndian = @BigEndian + SUBSTRING(@LittleEndian, ((8 - @Loop) * 2) + 1, 2);
  SET @Loop += 1;
END
SELECT CurrentIdentityValue = CONVERT(BIGINT, 
    CONVERT(VARBINARY(32), @BigEndian, 1), 2);

Kết quả cho BIGINT:

+----------------------+
| CurrentIdentityValue |
+----------------------+
|                      |
| 9223372036854775704  |
+----------------------+
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.