質問

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
  • 可変長列count = 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 huh?これはどこから来たのですか?
  3. sql_variant_property()は、整数があると言います。なぜTinyIntを選択しないのですか?
  4. sql_variant_property()がどこにあるかを知っている人はいますか? DACを使用して使用する必要がありますか?
役に立ちましたか?

解決

最初の2つの回答は、SQL Server Internals Book p.278からのものです

  1. 0x38 10進数で56です。これを示します intsys.types (system_type_id 桁)
  2. 0x01 のバージョン番号です sql_variant フォーマット(SQL Server 2008で常に1)
  3. これが文字通りの方法です 1 常にSQL Serverで解釈されます。例えば SELECT 1 AS foo INTO NewTable 整数データ型の新しい列が作成されます。別のデータ型として扱われたい場合は、明示的なキャストを使用してください。
  4. これは製品ソースコードの一部です。定義を表示できません。

ところで:他のデータタイプも見ている場合は、次のようにバージョン番号と列値の間にいくつかの追加バイトに遭遇する可能性があります。

  1. numeric/decimal 精度とスケールのためにそれぞれ1バイトを持っています。
  2. [n][var]char 最大長に2バイト、照合IDには4バイトがあります。
  3. [var]binary 最大長さの2バイトを持っています。
ライセンス: CC-BY-SA帰属
所属していません dba.stackexchange
scroll top