sql_variant (Transact-SQL)
儲存各種 SQL Server 支援之資料類型值的資料類型。
語法
sql_variant
備註
sql_variant 可用在資料行、參數、變數以及使用者定義函數的傳回值中。sql_variant 使這些資料庫物件能夠支援其他資料類型的值。
sql_variant 類型的資料行可包含不同資料類型的資料列。例如,定義為 sql_variant 的資料行,可以儲存 int、binary 和 char 值。下表列出無法利用 sql_variant 來儲存的值類型:
varchar(max) |
varbinary(max) |
nvarchar(max) |
xml |
text |
ntext |
image |
rowversion (timestamp) |
sql_variant |
geography |
hierarchyid |
geometry |
使用者定義型別 |
datetimeoffset |
sql_variant 的最大長度是 8016 位元組。其中包括基底類型資訊和基底類型值。實際基底類型值的最大長度是 8,000 位元組。
sql_variant 資料類型必須先轉換成基底資料類型值,之後,才能參與加法和減法之類的作業。
您可以指派預設值給 sql_variant。這項資料類型也可以用 NULL 作為基礎值,但 NULL 值並沒有相關的基底類型。另外,sql_variant 也不能有另一個 sql_variant 來作為它的基底類型。
唯一、主要或外部索引鍵可以包括 sql_variant 類型的資料行,但組成特定資料列的索引鍵之資料值總長度,不應超出索引的最大長度。這是 900 位元組。
一份資料表可以有任意數目的 sql_variant 資料行。
在 CONTAINSTABLE 和 FREETEXTTABLE 中,無法使用 sql_variant。
ODBC 不完全支援 sql_variant。因此,當您使用 Microsoft OLE DB Provider for ODBC (MSDASQL) 時,會將 sql_variant 資料行的查詢當作二進位資料傳回。例如,包含 'PS2091' 字元字串資料的 sql_variant 資料行會以 0x505332303931 傳回。
比較 sql_variant 值
sql_variant 資料類型屬於轉換的資料類型階層清單頂端。如果進行 sql_variant 比較,SQL Server 資料類型階層順序會分組到資料類型家族中。
資料類型階層 |
資料類型家族 |
---|---|
sql_variant |
sql_variant |
datetime2 |
日期和時間 |
datetimeoffset |
日期和時間 |
datetime |
日期和時間 |
smalldatetime |
日期和時間 |
date |
日期和時間 |
time |
日期和時間 |
float |
近似數值 |
real |
近似數值 |
decimal |
精確數值 |
money |
精確數值 |
smallmoney |
精確數值 |
bigint |
精確數值 |
int |
精確數值 |
smallint |
精確數值 |
tinyint |
精確數值 |
bit |
精確數值 |
nvarchar |
Unicode |
nchar |
Unicode |
varchar |
Unicode |
char |
Unicode |
varbinary |
二進位 |
binary |
二進位 |
uniqueidentifier |
Uniqueidentifier |
下列規則適用於 sql_variant 比較:
當比較不同基底資料類型的 sql_variant 值,且基底資料類型是在不同的資料類型家族中,資料類型家族在階層圖表中較高位置的值,會被視為兩個值中的較大者。
當比較不同基底資料類型的 sql_variant 值,且基底資料類型是在相同的資料類型家族中,會先將基底資料類型在階層圖表中較低位置的值隱含地轉換成其他資料類型,之後,再進行比較。
當比較 char、varchar、nchar 或 nvarchar 資料類型的 sql_variant 值時,將會先根據以下準則來比較其定序:LCID、LCID 版本、比較旗標和排序識別碼。每一個準則都會以整數值的形式來比較,而且會根據所列的順序來比較。如果所有的準則都相同,將會根據此定序來比較實際的字串值。