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:

  1. 0x3801 ... ¿Qué es eso?
  2. i = 328792402 ¿eh? ¿De dónde viene esto?
  3. Sql_variant_property () dice que tengo un entero. ¿Por qué no elige Tinyint?
  4. ¿Alguien sabe dónde se puede encontrar sql_variant_property ()? ¿Debo usar el DAC para hacerlo?
¿Fue útil?

Solución

Las primeras 2 respuestas son del libro de partes internas de SQL Server P.278

  1. 0x38 es 56 en decimal. Esto indica int en sys.types (system_type_id columna)
  2. 0x01 es el número de versión del sql_variant Formato (siempre 1 en SQL Server 2008)
  3. Esta es la forma en que el literal 1 siempre se interpreta en SQL Server. p.ej SELECT 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.
  4. 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.

  1. numeric/decimal tener 1 byte cada uno para precisión y escala.
  2. [n][var]char Tener 2 bytes para la longitud máxima y 4 bytes para ID de recopilación.
  3. [var]binary Tener 2 bytes para la longitud máxima.
Licenciado bajo: CC-BY-SA con atribución
No afiliado a dba.stackexchange
scroll top