sql_variant 比较
sql_variant 列可以包含具有几种基本数据类型和排序规则的值,所以当比较 sql_variant 操作数时,要应用一些特殊规则。这些规则适用于各种比较操作,例如:
Transact-SQL 比较运算符
ORDER BY、GROUP BY
索引
MAX 和 MIN 聚合函数
UNION(不包括 ALL)
CASE 表达式
为了进行 sql_variant 比较,SQL Server 数据类型层次结构顺序划分为数据类型系列。sql_variant 系列的优先级最高。
数据类型层次结构
数据类型系列
sql_variant
sql_variant
datetime
日期和时间
smalldatetime
日期和时间
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 值,而且基本数据类型属于相同的数据类型系列时,层次结构图中基本数据类型较低的值先隐式转换成其他数据类型,然后再进行比较。
在比较 char、varchar、nchar 或 varchar 数据类型的 sql_variant 值时,将基于以下条件进行计算:LCID、LCID 版本、比较标志和排序 ID。各个条件按所列出的顺序作为整数值进行比较。
应用这些规则在 sql_variant 值之间进行比较与在具有相同基本数据类型的值之间进行比较,它们会产生不同的结果。
操作数 A
操作数 B
非变量比较结果
sql_variant 比较结果
'123' char
111 int
A > B
B > A
50000 int
5E1 float
A > B
B > A
因为不同数据类型系列的值在比较谓词中引用前必须显式转换,所以只有当对 sql_variant 列上的结果集进行排序时才能看出这些规则的效果。下表中的值是有关数据类型优先级规则的示例。
PriKey
VariantCol
1
50.0(基类型 float)
2
5000(基类型 int)
3
'124000'(基类型 char(6))
下表显示以下语句的结果:SELECT * FROM VariantTest ORDER BY VariantCol ASC。
PriKey
VariantCol
3
'124000'(基类型 char(6))
2
5000(基类型 int)
1
50.0(基类型 float)
下表中的值是使用不同的排序规则时排序规则优先级规则的示例。
IntKey
VariantCol
1
qrs (varchar SQL_Latin1_General_Pref_Cp1_CI_AS)
2
abc (varchar SQL_Latin1_General_Pref_Cp1_CI_AS)
3
qrs (varchar SQL_Latin1_General_CP1_CS_AS)
4
17.5 (decimal)
5
abc (varchar SQL_Latin1_General_CP1_CS_AS)
6
klm (varchar SQL_Latin1_General_CP1_CS_AS)
7
1.2 (decimal)
下表显示了 SELECT * FROM CollateTest ORDER BY VariantCol 语句的结果。下表显示的是组合在一起的确切数字数据类型系列的值和按各自的排序规则中组合的 varchar 值。
IntKey
VariantCol
5
abc (varchar SQL_Latin1_General_CP1_CS_AS)
6
klm (varchar SQL_Latin1_General_CP1_CS_AS)
3
qrs (varchar SQL_Latin1_General_CP1_CS_AS)
2
abc (varchar SQL_Latin1_General_Pref_Cp1_CI_AS)
1
qrs (varchar SQL_Latin1_General_Pref_Cp1_CI_AS)
7
1.2 (decimal)
4
17.5 (decimal)