SQL Serverストレージ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
- 可変長列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
私の質問:
- 0x3801 ...それは何ですか
- i = 328792402 huh?これはどこから来たのですか?
- sql_variant_property()は、整数があると言います。なぜTinyIntを選択しないのですか?
- sql_variant_property()がどこにあるかを知っている人はいますか? DACを使用して使用する必要がありますか?
解決
最初の2つの回答は、SQL Server Internals Book p.278からのものです
0x38
10進数で56です。これを示しますint
のsys.types
(system_type_id
桁)0x01
のバージョン番号ですsql_variant
フォーマット(SQL Server 2008で常に1)- これが文字通りの方法です
1
常にSQL Serverで解釈されます。例えばSELECT 1 AS foo INTO NewTable
整数データ型の新しい列が作成されます。別のデータ型として扱われたい場合は、明示的なキャストを使用してください。 - これは製品ソースコードの一部です。定義を表示できません。
ところで:他のデータタイプも見ている場合は、次のようにバージョン番号と列値の間にいくつかの追加バイトに遭遇する可能性があります。
numeric
/decimal
精度とスケールのためにそれぞれ1バイトを持っています。[n][var]char
最大長に2バイト、照合IDには4バイトがあります。[var]binary
最大長さの2バイトを持っています。
所属していません dba.stackexchange