我知道你已经有了一些好的答案,但我认为 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 变量仅对填充了参数:“BaseType”的值有效,否则它会返回 null。据我所知,这是由于 SQL 说:“您这里没有数据,无法确定内存使用情况。”
通常,当我明确希望数据集包含未知值的零时,我会指定 isnull(@thing, 0)。其他时候,我可能希望用户知道空值发生了其他事情,例如 isnull(@thing,'not present') 用于报告。还有其他时候,您可以使用 coalesce 来基本上创建一系列可能性 coalesce(@thing, @otherthing, @yetotherthing, 'unknown')。
我认为在代码中,你看到的是有人在转换某些东西,但我不确定你真正需要这样做的地方。表中列的数据类型保持其所需的状态,当它为空时,SQL 不会在其中存储内存。因此,改变它的必要性在我看来似乎是武断的。我知道,当你预期有更多的空值时,可以使用 SQL 2008 中引入的 SPARSE 选项来处理更好的内存消耗。但我不知道什么时候将几乎不消耗任何东西的内容转换为更多的内容。