SQL Server Storage SQL_Variant
-
16-10-2019 - |
Pregunta
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
- Tamaño de registro = 17b
- 30000400 01000001 00110038 01010000 00
- TAGA = 0x30 = 1B
- TAGB = 0x00 = 1B
- NULL BITMAP OFFSET = 0x0004 = 2B
- Recuento de columnas = 0x0001 = 2b
- Mapa de bits nulo = 0x00 = 1b
- Columnas de longitud variable recuento = 0x0001 = 2b
- Matriz de compensación de columna de longitud variable = 0x0011 = 2b
- Esta es la codificación sql_variant para enteros ...Supongo = 0x0138 = 2B
- Nuestra columna entera = 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
Mis preguntas:
- 0x3801 ... ¿Qué es eso?
- i = 328792402 ¿eh? ¿De dónde viene esto?
- Sql_variant_property () dice que tengo un entero. ¿Por qué no elige Tinyint?
- ¿Alguien sabe dónde se puede encontrar sql_variant_property ()? ¿Debo usar el DAC para hacerlo?
Solución
Las primeras 2 respuestas son del libro de partes internas de SQL Server P.278
0x38
es 56 en decimal. Esto indicaint
ensys.types
(system_type_id
columna)0x01
es el número de versión delsql_variant
Formato (siempre 1 en SQL Server 2008)- Esta es la forma en que el literal
1
siempre se interpreta en SQL Server. p.ejSELECT 1 AS foo INTO NewTable
Creará una nueva columna de tipo de datos enteros. Use un reparto explícito si desea que se trate como un tipo de datos diferente. - Esto es parte del código fuente del producto. No puede ver la definición.
Por cierto: si también está buscando otros tipos de datos, puede encontrar algunos bytes adicionales entre el número de versión y el valor de la columna de la siguiente manera.
numeric
/decimal
tener 1 byte cada uno para precisión y escala.[n][var]char
Tener 2 bytes para la longitud máxima y 4 bytes para ID de recopilación.[var]binary
Tener 2 bytes para la longitud máxima.
Licenciado bajo: CC-BY-SA con atribución
No afiliado a dba.stackexchange