Domanda

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
  • Record Size = 17B
  • 30000400 01000001 00110038 01010000 00
  • TagA = 0x30 = 1B
  • TagB = 0x00 = 1B
  • Null bitmap Offset = 0x0004 = 2B
  • Colonna Count = 0x0001 = 2B
  • Null Bitmap = 0x00 = 1B
  • colonne di lunghezza variabile Count = 0x0001 = 2B
  • Variable-Length colonna Offset Array = 0x0011 = 2B
  • Questa è la codifica sql_variant per gli interi ... Credo che = 0x0138 = 2B
  • La nostra colonna integer = 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

Le mie domande:

  1. 0x3801 ... che cosa è che
  2. i = 328.792.402 Eh? Da dove proviene?
  3. SQL_VARIANT_PROPERTY () dice che ho un intero. Perché non scegliere tinyint?
  4. Qualcuno sa dove () può essere trovato SQL_VARIANT_PROPERTY. È necessario utilizzare il DAC per arrivare a questo?
È stato utile?

Soluzione

I primi 2 risposte sono da SQL Server Internals Libro p.278

  1. 0x38 è 56 in decimale. Questo indica int a sys.types (colonna system_type_id)
  2. 0x01 è il numero di versione del formato sql_variant (sempre 1 in SQL Server 2008)
  3. Questo è il modo in cui il 1 letterale viene sempre interpretata in SQL Server. per esempio. SELECT 1 AS foo INTO NewTable creerà una nuova colonna di tipo di dati integer. Utilizzare un cast esplicito, se si desidera che venga trattata come un tipo di dati diverso.
  4. Questo fa parte del codice sorgente del prodotto. Non è possibile visualizzare la definizione.

A proposito:. Se siete alla ricerca in altri tipi di dati come pure è possibile riscontrare alcuni byte aggiuntivi tra il numero di versione e il valore della colonna come segue

  1. numeric / decimal disponiamo di 1 byte ciascuno per la precisione e la scala.
  2. [n][var]char avere 2 byte per la lunghezza e 4 max byte per la fascicolazione id.
  3. [var]binary avere 2 byte per la lunghezza max.
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a dba.stackexchange
scroll top