sql_variant (Transact-SQL)

適用於:SQL ServerAzure SQL DatabaseAzure SQL 受控執行個體

儲存各種 SQL Server 支援之資料類型值的資料類型。

Transact-SQL 語法慣例

Syntax

sql_variant  

注意

若要檢視 SQL Server 2014 (12.x) 和舊版的 Transact-SQL 語法,請參閱 舊版檔

備註

sql_variant 可用在資料行、參數、變數及使用者定義函式的傳回值中。 sql_variant 可讓這些資料庫物件支援其他資料類型的值。

sql_variant 類型的資料行可包含不同資料類型的資料列。 例如,定義為 sql_variant 的資料行可儲存 intbinary,及 char 值。

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
binary Binary
uniqueidentifier Uniqueidentifier

下列規則適用於 sql_variant 比較:

  • 當比較不同基底資料型別的 sql_variant 值,且基底資料型別是在不同的資料類型家族中時,資料類型家族在階層圖表中較高位置的值,會被視為兩個值中的較大者。
  • 當比較不同基底資料型別的 sql_variant 值,且基底資料型別是在相同的資料類型家族中,會先將基底資料型別在階層圖表中較低位置的值隱含轉換成其他資料類型,之後再進行比較。
  • 當比較 charvarcharncharnvarchar 資料類型的 sql_variant 值時,將會先根據以下準則來比較其定序:LCID、LCID 版本、比較旗標和排序識別碼。 每一個準則都會以整數值的形式來比較,而且會根據所列的順序來比較。 如果所有的準則都相同,將會根據此定序來比較實際的字串值。

轉換 sql_variant 資料

處理 sql_variant 資料類型時,SQL Server 支援將包含其他資料類型的物件隱含轉換成 sql_variant 類型。 但 SQL Server 不支援從 sql_variant 資料隱含轉換成包含其他資料類型的物件。

限制

以下列出無法使用 sql_variant 來儲存的值類型:

  • datetimeoffset1
  • 地理位置
  • 幾何
  • hierarchyid
  • image
  • ntext
  • nvarchar(max)
  • rowversion (timestamp)
  • text
  • varchar(max)
  • varbinary(max)
  • 使用者定義型別
  • xml

1 SQL Server 2012 和更新版本不會限制 datetimeoffset

範例

A. 在資料表中使用 sql_variant

下列範例會使用 sql_variant 資料類型建立資料表。 接著範例會擷取有關 colA46279.1SQL_VARIANT_PROPERTY 資訊,如果 tableAcolBsql_variant 類型的 colA,則 colB =1689

CREATE TABLE tableA(colA sql_variant, colB INT)  
INSERT INTO tableA values ( CAST(46279.1 as decimal(8,2)), 1689)  
SELECT   SQL_VARIANT_PROPERTY(colA,'BaseType') AS 'Base Type',  
         SQL_VARIANT_PROPERTY(colA,'Precision') AS 'Precision',  
         SQL_VARIANT_PROPERTY(colA,'Scale') AS 'Scale'  
FROM      tableA  
WHERE     colB = 1689  

以下為結果集。 請注意,這三個值的每一個都是 sql_variant

Base Type    Precision    Scale  
---------    ---------    -----  
decimal      8           2  
  
(1 row(s) affected)  

B. 使用 sql_variant 作為變數

下列範例會使用 sql_variant 資料類型建立變數,然後擷取關於名為 @v1 之變數的 SQL_VARIANT_PROPERTY 資訊。

DECLARE @v1 sql_variant;  
SET @v1 = 'ABC';  
SELECT @v1;  
SELECT SQL_VARIANT_PROPERTY(@v1, 'BaseType');  
SELECT SQL_VARIANT_PROPERTY(@v1, 'MaxLength');  

另請參閱

CAST 和 CONVERT (Transact-SQL)
SQL_VARIANT_PROPERTY (Transact-SQL)