2.2.5.5.4 sql_variant Values

The SSVARIANTTYPE is a special data type that acts as a place holder for other data types. When a SSVARIANTTYPE is filled with a data value, it takes on properties of the base data type that represents the data value. To support this dynamic change, for those that are not NULL (GEN_NULL) the SSVARIANTTYPE instance has an SSVARIANT_INSTANCE internal structure according to the following definition.

 VARIANT_BASETYPE    =   BYTE      ; data type definition
 VARIANT_PROPBYTES   =   BYTE      ; see below
 VARIANT_PROPERTIES  =   *BYTE     ; see below
 VARIANT_DATAVAL     =   1*BYTE    ; actual data value
            
 SSVARIANT_INSTANCE  =   VARIANT_BASETYPE
                         VARIANT_PROPBYTES
                         VARIANT_PROPERTIES
                         VARIANT_DATAVAL

VARIANT_BASETYPE is the TDS token of the base type.

VARIANT_BASETYPE

 VARIANT_PROPBYTES

 VARIANT_PROPERTIES

GUIDTYPE, BITTYPE, INT1TYPE, INT2TYPE, INT4TYPE, INT8TYPE, DATETIMETYPE, DATETIM4TYPE, FLT4TYPE, FLT8TYPE, MONEYTYPE, MONEY4TYPE, DATENTYPE

0

<not specified>

TIMENTYPE, DATETIME2NTYPE, DATETIMEOFFSETNTYPE

1

1 byte specifying scale

BIGVARBINARYTYPE, BIGBINARYTYPE

2

2 bytes specifying max length

NUMERICNTYPE, DECIMALNTYPE

2

1 byte for precision followed by 1 byte for scale

BIGVARCHARTYPE, BIGCHARTYPE, NVARCHARTYPE, NCHARTYPE

7

5-byte COLLATION, followed by a 2-byte max length

Note  Data types cannot be NULL when inside a sql_variant. If the value is NULL, the sql_variant itself has to be NULL, but it is not allowed to specify a non-null sql_variant instance and have a NULL value wrapped inside it. A raw collation SHOULD NOT be specified within a sql_variant.<15>