可为空性和三值逻辑比较

适用范围:SQL Server

如果熟悉 SQL Server 数据类型,可以在 .NET Framework 的 System.Data.SqlTypes 命名空间中找到类似的语义和精度。 但是,有一些差异,本文介绍了这些差异中最重要的部分。

Null 值

本机公共语言运行时(CLR)数据类型和 SQL Server 数据类型的主要区别在于,前者不允许 NULL 值,而后者提供完整的 NULL 语义。

比较受 NULL 值的影响。 在比较两个值 xy时,如果 xyNULL,则一些逻辑比较计算结果为 UNKNOWN 值而不是 true 或 false。

SqlBoolean 数据类型

System.Data.SqlTypes 命名空间引入了 SqlBoolean 类型来表示此三值逻辑。 任何 SqlTypes 之间的比较返回 SqlBoolean 值类型。 UNKNOWN 值由 SqlBoolean 类型的 null 值表示。 提供属性 IsTrueIsFalseIsNull 来检查 SqlBoolean 类型的值。

操作、函数和 null 值

所有算术运算符(+-*/%)、按位运算符(~&|),如果 SqlTypes 的任何操作数或参数为 null,则大多数函数将返回 NULLIsNull 属性始终返回 truefalse 值。

Precision

.NET Framework CLR 中的十进制数据类型的最大值与 SQL Server 中的数值和十进制数据类型不同。 此外,在 .NET Framework CLR 十进制数据类型中,假定最大精度。 但是,在 SQL Server 的 CLR 中,SqlDecimal 提供与 SQL Server 中的十进制数据类型相同的最大精度和小数位数和语义。

溢出检测

在 .NET Framework CLR 中,添加两个非常大的数字可能不会引发异常。 相反,如果未使用 check 运算符,则返回的结果可能会 环绕 为负整数。 在 System.Data.SqlTypes中,为所有溢出和下溢错误以及除以零错误引发异常。