我知道您已经有了一些好的答案,但我认为 SQL_VARIANT_PROPERTY 被误解了。
您将 SQL_Variant_Property 与列一起使用,然后在其元数据属性上指示您想要什么。但是,如果它为空,它不会告诉你太多。
例如:
declare
@Start date = getdate()
, @End datetime= getdate()
, @Int int = 1
, @DateNull date
;
select
sql_variant_property(@Start, 'BaseType')
, sql_variant_property(@End, 'BaseType')
, sql_variant_property(@Int, 'BaseType')
, sql_variant_property(@DateNull, 'BaseType')
将返回三个数据类型和一个空值。处理 NULL 是 SQL 的重要组成部分。很多人,包括我自己,有时都想用一个值来处理 null 来表示它,或者在其他时候不在乎。SQL Variant 仅适用于带有参数的填充值:'BaseType',否则它将返回 null。据我所知,这是由于 SQL 说:“你这里没有数据,没有什么可确定的内存使用情况。”
通常我会在使用整数时指定 isnull(@thing, 0) 如果我明确希望数据集包含未知数的零。在其他时候,我可能希望让用户知道 null 出现对报告做了其他 isnull(@thing, 'not present') 的事情。还有一些时候,你可以使用 coalesce 来处理一系列可能性,coalesce(@thing, @otherthing, @yetotherthing, 'unknown')。
我认为在代码中,当我不确定您真正需要在哪里做这样的事情时,您正在目睹某人正在转换某些东西。表中列的数据类型被维护为它需要的数据类型,当它为 NULL 时 SQL 不会在其中存储内存。因此,恕我直言,需要更改它似乎是任意的。我确实知道,当您期望使用我相信在 SQL 2008 中引入的 SPARSE 选项有更多空值时,您可以处理更好的内存消耗。但我不知道何时将几乎不消耗任何东西的东西转换为更多。