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:

  1. 0x3801 ... qu'est-ce que
  2. i = 328792402 Huh? Lorsque cela vient de ne?
  3. SQL_VARIANT_PROPERTY () dit que j'ai un entier. Pourquoi il ne choisit pas tinyint?
  4. Est-ce que quelqu'un sait où SQL_VARIANT_PROPERTY () peut être trouvé. Dois-je utiliser le CAD pour nous mettre au travail?
Était-ce utile?

La solution

Les 2 premières réponses sont de la p.278 Internes SQL Server livre

  1. 0x38 est 56 en décimal. Cela indique int dans sys.types (colonne system_type_id)
  2. 0x01 est le numéro de version du format sql_variant (toujours 1 dans SQL Server 2008)
  3. 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.
  4. 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

  1. numeric / decimal ont 1 octet pour chaque précision et une échelle.
  2. [n][var]char ai 2 octets de longueur maximum et 4 octets pour identification de collation.
  3. [var]binary ai 2 octets de longueur maximale.
Licencié sous: CC-BY-SA avec attribution
Non affilié à dba.stackexchange
scroll top