SQL Server Storage SQL_VARIANT
-
16-10-2019 - |
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:
- 0x3801 ... was ist das
- I = 328792402 Huh? Von wo ist das gekommen?
- Sql_variant_property () sagt, ich habe eine Ganzzahl. Warum wählt es nicht Tinyint?
- Weiß jemand, wo sql_variant_property () gefunden werden kann. Muss ich den DAC benutzen, um es anzusprechen?
Lösung
Die ersten 2 Antworten stammen aus dem SQL Server -Interna -Buch S.278
0x38
ist 56 in Decimal. Dies indiziertint
insys.types
(system_type_id
Säule)0x01
ist die Versionsnummer dersql_variant
Format (immer 1 in SQL Server 2008)- So ist der buchstäbliche Weg
1
wird immer in SQL Server interpretiert. z.BSELECT 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. - 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.
numeric
/decimal
Haben Sie jeweils 1 Byte für Präzision und Skala.[n][var]char
Haben Sie 2 Bytes für die maximale Länge und 4 Bytes für die Kollations -ID.[var]binary
2 Bytes für die maximale Länge haben.
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit dba.stackexchange