SQL Server Storage sql_variant
-
16-10-2019 - |
Question
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
- Enregistrement Taille = 17B
- 30000400 01000001 00110038 01010000 00
- TagA = 0x30 = 1B
- TagB = 0x00 = 1B
- Null Bitmap Décalage = 0x0004 = 2B
- colonne Count = 0x0001 = 2B
- Null Bitmap = 0x00 = 1B
- Colonnes de longueur variable Count = 0x0001 = 2B
- colonne de longueur variable Décalage Array = 0x0011 = 2B
- Ce codage est sql_variant pour les entiers ... Je suppose que = 0x0138 = 2B
- Notre colonne entier = 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
Mes questions:
- 0x3801 ... qu'est-ce que
- i = 328792402 Huh? Lorsque cela vient de ne?
- SQL_VARIANT_PROPERTY () dit que j'ai un entier. Pourquoi il ne choisit pas tinyint?
- Est-ce que quelqu'un sait où SQL_VARIANT_PROPERTY () peut être trouvé. Dois-je utiliser le CAD pour nous mettre au travail?
La solution
Les 2 premières réponses sont de la p.278 Internes SQL Server livre
-
0x38
est 56 en décimal. Cela indiqueint
danssys.types
(colonnesystem_type_id
) -
0x01
est le numéro de version du formatsql_variant
(toujours 1 dans SQL Server 2008) - Ceci est la façon dont le
1
littéral est toujours interprété dans SQL Server. par exemple.SELECT 1 AS foo INTO NewTable
va créer une nouvelle colonne de type de données entier. Utilisez un casting explicite si vous voulez qu'il soit traité comme un autre type de données. - Cela fait partie du code source du produit. Vous ne pouvez pas voir la définition.
BTW. Si vous êtes à la recherche d'autres types de données, ainsi que vous pouvez rencontrer quelques octets supplémentaires entre le numéro de version et la valeur de colonne comme suit
-
numeric
/decimal
ont 1 octet pour chaque précision et une échelle. -
[n][var]char
ai 2 octets de longueur maximum et 4 octets pour identification de collation. -
[var]binary
ai 2 octets de longueur maximale.
Licencié sous: CC-BY-SA avec attribution
Non affilié à dba.stackexchange