sql_variant SQL Server Storage
-
16-10-2019 - |
Domanda
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
- Record Size = 17B
- 30000400 01000001 00110038 01010000 00
- TagA = 0x30 = 1B
- TagB = 0x00 = 1B
- Null bitmap Offset = 0x0004 = 2B
- Colonna Count = 0x0001 = 2B
- Null Bitmap = 0x00 = 1B
- colonne di lunghezza variabile Count = 0x0001 = 2B
- Variable-Length colonna Offset Array = 0x0011 = 2B
- Questa è la codifica sql_variant per gli interi ... Credo che = 0x0138 = 2B
- La nostra colonna integer = 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
Le mie domande:
- 0x3801 ... che cosa è che
- i = 328.792.402 Eh? Da dove proviene?
- SQL_VARIANT_PROPERTY () dice che ho un intero. Perché non scegliere tinyint?
- Qualcuno sa dove () può essere trovato SQL_VARIANT_PROPERTY. È necessario utilizzare il DAC per arrivare a questo?
Soluzione
I primi 2 risposte sono da SQL Server Internals Libro p.278
-
0x38
è 56 in decimale. Questo indicaint
asys.types
(colonnasystem_type_id
) -
0x01
è il numero di versione del formatosql_variant
(sempre 1 in SQL Server 2008) - Questo è il modo in cui il
1
letterale viene sempre interpretata in SQL Server. per esempio.SELECT 1 AS foo INTO NewTable
creerà una nuova colonna di tipo di dati integer. Utilizzare un cast esplicito, se si desidera che venga trattata come un tipo di dati diverso. - Questo fa parte del codice sorgente del prodotto. Non è possibile visualizzare la definizione.
A proposito:. Se siete alla ricerca in altri tipi di dati come pure è possibile riscontrare alcuni byte aggiuntivi tra il numero di versione e il valore della colonna come segue
-
numeric
/decimal
disponiamo di 1 byte ciascuno per la precisione e la scala. -
[n][var]char
avere 2 byte per la lunghezza e 4 max byte per la fascicolazione id. -
[var]binary
avere 2 byte per la lunghezza max.
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a dba.stackexchange