Frage

USE tempdb ;
GO

DROP TABLE tbl ;
GO

CREATE TABLE tbl
(
    i SQL_VARIANT NOT NULL
) ;
GO

INSERT INTO tbl (i)
    VALUES (1) ;
GO

SELECT i FROM tbl ; 
GO

DBCC IND ('tempdb','tbl',-1) ;
GO

DBCC TRACEON (3604) ; -- Page dump will go the console
GO

DBCC PAGE ('tempdb',1,157,3) ;
GO
  • Datensatzgröße = 17b
  • 30000400 01000001 00110038 01010000 00
  • Taga = 0x30 = 1b
  • Tagb = 0x00 = 1b
  • Null bitmap offset = 0x0004 = 2b
  • Spaltenzahl = 0x0001 = 2b
  • Null bitmap = 0x00 = 1b
  • Spalten variabler Länge zählen = 0x0001 = 2b
  • Spaltenversetz-Array variabler Länge = 0x0011 = 2B
  • Dies ist die SQL_VARIANT -Codierung für Ganzzahlen ...ich vermute = 0x0138 = 2b
  • Unsere Ganzzahlspalte = 0x00000001 = 4B
    SELECT
      SQL_VARIANT_PROPERTY(i , 'BaseType') AS BaseType      -- SYSNAME NVARCHAR(128)
    , SQL_VARIANT_PROPERTY(i , 'Precision') AS [Precision]  -- INT
    , SQL_VARIANT_PROPERTY(i , 'Scale') AS Scale            -- INT
    , SQL_VARIANT_PROPERTY(i , 'TotalBytes') AS TotalBytes  -- INT
    , SQL_VARIANT_PROPERTY(i , 'Collation') AS [Collation]  -- SYSNAME NVARCHAR(128)
    , SQL_VARIANT_PROPERTY(i , 'MaxLength') AS MaxLength    -- INT
FROM
      tbl ;
GO

Meine Fragen:

  1. 0x3801 ... was ist das
  2. I = 328792402 Huh? Von wo ist das gekommen?
  3. Sql_variant_property () sagt, ich habe eine Ganzzahl. Warum wählt es nicht Tinyint?
  4. Weiß jemand, wo sql_variant_property () gefunden werden kann. Muss ich den DAC benutzen, um es anzusprechen?
War es hilfreich?

Lösung

Die ersten 2 Antworten stammen aus dem SQL Server -Interna -Buch S.278

  1. 0x38 ist 56 in Decimal. Dies indiziert int in sys.types (system_type_id Säule)
  2. 0x01 ist die Versionsnummer der sql_variant Format (immer 1 in SQL Server 2008)
  3. So ist der buchstäbliche Weg 1 wird immer in SQL Server interpretiert. z.B SELECT 1 AS foo INTO NewTable Erstellt eine neue Spalte mit ganzzahliger Datentype. Verwenden Sie eine explizite Besetzung, wenn Sie möchten, dass er als einen anderen Datentyp behandelt wird.
  4. Dies ist Teil des Produktquellcodees. Sie können die Definition nicht anzeigen.

BTW: Wenn Sie sich auch andere Datentypen ansehen, können Sie einige zusätzliche Bytes zwischen der Versionsnummer und dem Spaltenwert wie folgt begegnen.

  1. numeric/decimal Haben Sie jeweils 1 Byte für Präzision und Skala.
  2. [n][var]char Haben Sie 2 Bytes für die maximale Länge und 4 Bytes für die Kollations -ID.
  3. [var]binary 2 Bytes für die maximale Länge haben.
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit dba.stackexchange
scroll top