USE tempdb ; VAI DROP TABLE tbl ; VAI CRIAR TABELA tb ( i SQL_VARIANT NÃO NULO ); VAI INSERIR EM tbl (i) VALORES (1) ; VAI SELECT i FROM tbl ; VAI DBCC IND ('tempdb','tbl',-1); VAI DBCC TRACEON (3604); -- Despejo de página irá para o console VAI PÁGINA DBCC ('tempdb',1,157,3); VAI
- Tamanho do registro = 17B
- 30000400 01000001 00110038 01010000 00
- MarcaA = 0x30 = 1B
- EtiquetaB = 0x00 = 1B
- Deslocamento de bitmap nulo = 0x0004 = 2B
- Contagem de colunas = 0x0001 = 2B
- Bitmap nulo = 0x00 = 1B
- Contagem de colunas de comprimento variável = 0x0001 = 2B
- Matriz de deslocamento de coluna de comprimento variável = 0x0011 = 2B
- Esta é a codificação sql_variant para números inteiros... Acho que = 0x0138 = 2B
- Nossa coluna inteira = 0x00000001 = 4B
SELECIONE SQL_VARIANT_PROPERTY(i, 'BaseType') AS BaseType -- SYSNAME NVARCHAR(128) , SQL_VARIANT_PROPERTY(i, 'Precisão') AS [Precisão] -- INT , SQL_VARIANT_PROPERTY(i, 'Escala') AS Escala -- 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 A PARTIR DE tb ; VAI
Minhas perguntas:
- 0x3801... o que é isso
- i = 328792402 Hã? De onde veio isso?
- SQL_VARIANT_PROPERTY() diz que tenho um número inteiro. Por que não escolhe tinyint?
- Alguém sabe onde SQL_VARIANT_PROPERTY() pode ser encontrado. Devo usar o DAC para obtê-lo?
As 2 primeiras respostas são do SQL Server Internals Book p.278
0x38
é 56 em decimal. Isso indicaint
emsys.types
(system_type_id
coluna)0x01
é o número da versão dosql_variant
formato (sempre 1 no SQL Server 2008)1
é sempre interpretado no SQL Server. por exemploSELECT 1 AS foo INTO NewTable
, criará uma nova coluna de tipo de dados inteiro. Use uma conversão explícita se quiser que ela seja tratada como um tipo de dados diferente.BTW: Se você também estiver olhando para outros tipos de dados, poderá encontrar alguns bytes adicionais entre o número da versão e o valor da coluna, conforme a seguir.
numeric
/decimal
tem 1 byte cada para precisão e escala.[n][var]char
tem 2 bytes para comprimento máximo e 4 bytes para id de agrupamento.[var]binary
tem 2 bytes para comprimento máximo.