sql_variant 类型用于存储SQL SERVER中支持的各种数据类型。
为了进行 sql_variant 比较,SQL Server 数据类型层次结构顺序划分为多个数据类型系,sql_variant 数据类型在用于转换的数据类型层次结构列表中位于顶部。
数据类型层次结构数据类型系列
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 值进行比较,而且基本数据类型属于相同的数据类型系列时,则在层次结构图中基本数据类型较低的值先隐式转换为其他数据类型,然后再进行比较。
在比较 char、varchar、nchar 或 nvarchar 数据类型的 sql_variant 值时,将首先基于以下条件来比较这些值的排序规则:LCID、LCID 版本、比较标志和排序 ID。其中的每个条件都按所列出的顺序作为整数值进行比较。如果所有这些条件都相等,则将按照排序规则来比较实际的字符串值。
例如:
begin
declare
@v1 sql_variant = cast ('15.00' as float(53)),
@v2 sql_variant = cast ('15.00' as decimal(18,4)),
@v3 sql_variant = cast ('15' as tinyint),
@v4 sql_variant = cast ('00:00:15.00' as time)
select
case when @v1 > @v2
then 'v1 > v2'
when @v2 > @v1
then 'v2 > v1'
else 'v2 = v1' --
end,
case when @v1 > @v3
then 'v1 > v3'
when @v3 > @v1
then 'v3 > v1'
else 'v3 = v1' --
end,
case when @v2 > @v3
then 'v2 > v3'
when @v3 > @v2
then 'v3 > v2'
else 'v2 = v3' --
end,
case when @v1 > @v4
then 'v1 > v4'
when @v4 > @v1
then 'v4 > v1' --
else 'v4 = v1'
end
end
@v1 和@v2比较,因为 @v1的基本类型float属于近似数值系列,@v2的基本类型decimal属于精确数据系列,所以'v1 > v2'
@v1 和@v3比较,因为@v1的基本类型float属于近似数值系列,@v3的基本类型tinyint属于精确数据系列,所以'v1 > v3'
@v2和@v3比较,因为@v2的基本类型decimal和@v3的基本类型tinyint同属于精确数据系列,v3隐式转换成decimal类型,所以v2 = v3
@v1 和@v4比较,因为@v1的基本类型float属于近似数值系列,@v4的基本类型time 属于日期和时间,所以v4 > v1