Вопрос

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
  • Размер записи = 17b
  • 30000400 01000001 00110038 01010000 00
  • TAGA = 0x30 = 1b
  • Tagb = 0x00 = 1b
  • Null bitmap offset = 0x0004 = 2b
  • Количество столбцов = 0x0001 = 2b
  • Null Bitmap = 0x00 = 1b
  • Количество столбцов переменной длины = 0x0001 = 2b
  • Смещение столбца переменной длины массив = 0x0011 = 2b
  • Это кодирование SQL_Variant для целых чисел ...Наверное = 0x0138 = 2b
  • Наша целочисленная колонка = 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

Мои вопросы:

  1. 0x3801 ... что это
  2. i = 328792402 да? Откуда это взялось?
  3. Sql_variant_property () говорит, что у меня есть целое число. Почему он не выбирает Tinyint?
  4. Кто -нибудь знает, где можно найти sql_variant_property (). Должен ли я использовать ЦАП, чтобы добраться до него?
Это было полезно?

Решение

Первые 2 ответа из книги SQL Server Internals с.278

  1. 0x38 56 в десятичном. Это указывает int в sys.types (system_type_id столбец)
  2. 0x01 это номер версии sql_variant Формат (всегда 1 в SQL Server 2008)
  3. Так буквально 1 всегда интерпретируется в SQL Server. например SELECT 1 AS foo INTO NewTable Создаст новый столбец целочисленного данных. Используйте явный состав, если вы хотите, чтобы он рассматривался как другой дат данных.
  4. Это часть исходного кода продукта. Вы не можете просмотреть определение.

Кстати: если вы также смотрите на другие даты, вы можете встретить некоторые дополнительные байты между номером версии и значением столбца следующим образом.

  1. numeric/decimal Иметь 1 байт каждый для точности и масштаба.
  2. [n][var]char Иметь 2 байта для максимальной длины и 4 байта для идентификатора сбора.
  3. [var]binary Иметь 2 байта по длине максимума.
Лицензировано под: CC-BY-SA с атрибуция
Не связан с dba.stackexchange
scroll top