SQL Server Storage SQL_Variant
-
16-10-2019 - |
Вопрос
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
Мои вопросы:
- 0x3801 ... что это
- i = 328792402 да? Откуда это взялось?
- Sql_variant_property () говорит, что у меня есть целое число. Почему он не выбирает Tinyint?
- Кто -нибудь знает, где можно найти sql_variant_property (). Должен ли я использовать ЦАП, чтобы добраться до него?
Решение
Первые 2 ответа из книги SQL Server Internals с.278
0x38
56 в десятичном. Это указываетint
вsys.types
(system_type_id
столбец)0x01
это номер версииsql_variant
Формат (всегда 1 в SQL Server 2008)- Так буквально
1
всегда интерпретируется в SQL Server. напримерSELECT 1 AS foo INTO NewTable
Создаст новый столбец целочисленного данных. Используйте явный состав, если вы хотите, чтобы он рассматривался как другой дат данных. - Это часть исходного кода продукта. Вы не можете просмотреть определение.
Кстати: если вы также смотрите на другие даты, вы можете встретить некоторые дополнительные байты между номером версии и значением столбца следующим образом.
numeric
/decimal
Иметь 1 байт каждый для точности и масштаба.[n][var]char
Иметь 2 байта для максимальной длины и 4 байта для идентификатора сбора.[var]binary
Иметь 2 байта по длине максимума.
Не связан с dba.stackexchange