SQL Serverは、テーブルのIDENTITY VALUEを物理的にどこに保存しますか?


12

誰かが私にこの方向を正しい方向に向けてくれることを望んでいます。これが私のこれまでの成果です。

SELECT * FROM sys.identity_columns"last_value"を与えるシステムビューですが、そのビューの定義は内部関数を使用しますIdentityProperty(colName, 'LastValue')-したがって、それは行き止まりです(そこでシステムテーブルからプルしません)。

インターネットのどこでも(私が見た)DBCC IDENT_...コマンドを使用して値を明らかにすることを提案していますが、それでも実際に保存されている場所については暗闇の中に残ります。

そこで、DBCC PAGE(TestDB,1,1325,3)テストハーネスデータベースに対して個々のページを検索し、RESEEDコマンドを使用して値10と12の間で再シードすることにしました。

これを行うには、私は上の進値に気づいたIAM: HeaderIAM: Single Page AllocationsIAM: Extent Alloc Status Slot 1すべてが変わりました。(また、bUse1の値は、それ自体で徐々に変化しますが、とにかく定期的に変化することに気付きました)。

だからもう一つの行き止まりと私はすべてのアイデアからです。他にどこで検索できますか?

私はSQL Server 2014を実行しています。内部知識に対する飽くなき渇望がありますが、これほど理解しにくいものはまだありません。理論的には(絶対値)がどこかに保存され、(ほぼ間違いなく)位置を特定できるはずなので、私の注意を引きました。内部的に保存されたデータ/メタデータの場所を発見する私の探求において、この特定の値は私が特にとらえどころのないものとして私を打つ。私は誰かが一緒に来て私に言うことを推測/望んでいます、あなたはそれを手に入れることができますがDBCC PAGE、間違った場所を見ていました。

回答:


8

DAC(Dedicated Administrator Console)にアクセスできる場合、列のID列の値をINT調べるには、idtval列を調べますsys.syscolpars

ここで関連する質問についてのRoi Gavishによるこの非常に有用な答えを介して私をそのテーブルに案内してくれたMartin Smithに感謝します。

たとえば、次の一時テーブルを使用します。

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;

テーブルに含まれるものを見てみましょう。

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

ID値は次のコードで検査できます。

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           |
+----------------------+

以下のためにBIGINTID列、我々は次のようなコードで使用されるいくつかの変数のサイズを拡張する必要があります。

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);

の結果BIGINT

+----------------------+
| CurrentIdentityValue |
+----------------------+
|                      |
| 9223372036854775704  |
+----------------------+
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.