首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >NULL有数据类型吗?

NULL有数据类型吗?
EN

Stack Overflow用户
提问于 2013-03-27 05:16:53
回答 5查看 19.6K关注 0票数 11

今天我遇到了类似的代码。

代码语言:javascript
复制
SELECT AuditDomain, 
    ObjectId,
    AuditSubdomain = CONVERT(VARCHAR(50), NULL),
    SubDomainObjectId = CONVERT(INT, NULL)
FROM Audit

这似乎意味着数据类型信息可以与空值相关联。这是否将元数据附加到将其标识为指定数据类型的空值?

This post详细介绍了一种在Sql Server中查找数据类型的方法,但当我尝试下面这行代码时,它返回的结果为NULL:

代码语言:javascript
复制
SELECT CAST(SQL_VARIANT_PROPERTY(CONVERT(INT, NULL), 'BaseType') AS VARCHAR(20))
EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2013-03-27 05:24:57

在SQL Server中,在我能想到的所有场景中,默认情况下NULL都是一个INT。您可以使用以下代码来确定这一点:

代码语言:javascript
复制
SELECT x = NULL INTO #x;
EXEC tempdb..sp_columns '#x';

结果:

代码语言:javascript
复制
TABLE_QUALIFIER TABLE_OWNER TABLE_NAME COLUMN_NAME DATA_TYPE TYPE_NAME
--------------- ----------- ---------- ----------- --------- ---------
tempdb          dbo         #x___...   x           4         int

在您将其放入表中或以其他方式将其与一些上下文元数据相关联之前,这给您带来了什么?是INT还是DATETIME或者其他什么有什么区别呢?您将如何处理这些信息?

SQL_VARIANT_PROPERTY返回NULL,因为它似乎同时需要元数据和值才有意义。观察(使用不同的类型将其混合):

代码语言:javascript
复制
SELECT SQL_VARIANT_PROPERTY(NULL, 'BaseType');

DECLARE @x DATE;

SELECT SQL_VARIANT_PROPERTY(@x, 'BaseType');

DECLARE @y DATE = SYSDATETIME();

SELECT SQL_VARIANT_PROPERTY(@y, 'BaseType');

结果:

代码语言:javascript
复制
NULL

NULL

date

因此,为了准确地确定基类型,似乎需要同时使用类型和值。

至于它到底为什么会这样工作,你可以耸肩。你得去问那些有源代码访问权的人。

请注意,只有当您强迫SQL Server使用时,NULL才必须采用一个基类型:您已经基于它创建了一个表。在这种情况下,SQL Server很可能会返回一个错误(事实上,在许多情况下,它必须猜测您所指的数据类型)。避免这种情况的方法是不要创建SQL Server必须猜测的情况(这就是为什么我问,您将如何处理这些信息?)。

票数 16
EN

Stack Overflow用户

发布于 2013-03-27 05:47:29

Null没有数据类型。null的用途是表示一个“未知的”,无论是值还是类型。

ISNULL()返回第一个参数的数据类型,并向其提供数据类型。

http://msdn.microsoft.com/en-us/library/ms187928.aspx

票数 0
EN

Stack Overflow用户

发布于 2013-03-27 06:09:29

我知道你已经有了一些很好的答案,但我认为SQL_VARIANT_PROPERTY被误解了。

您可以对列使用SQL_Variant_Property,然后在它的元数据属性上指示您想要的内容。然而,如果它是空的,它不会告诉你太多。

例如:

代码语言:javascript
复制
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。处理NULL是SQL的一个重要组成部分。很多人,包括我自己,有时想用一个值来表示null,或者在其他时候不关心。SQL Variant仅适用于使用参数'BaseType‘填充的值,否则将返回null。据我所知,这是因为SQL说:“您这里没有数据,没有任何东西可以确定内存使用情况。”

通常,我会在处理整数时指定isnull(@thing,0),因为我明确希望数据集包含表示未知数的零。在其他时候,我可能希望让用户知道空事件会对报告执行其他操作为空(@thing,'not present')。还有一些时候,你可以使用coalesce来实现一个可能性数组的合并(@thing,@ other thing,@yetotherthing,'unknown')。

我认为在你看到的代码中,有人正在转换一些东西,而我不确定你真正需要在哪里做这样的事情。表中列的数据类型是维护它所需的数据类型,当它为NULL时,SQL不会在其中存储内存。因此,改变它的需要似乎是武断的。我知道当你期望更多的空值时,我相信在SQL2008中引入的稀疏选项可以处理更好的内存消耗。但我不知道什么时候才能让几乎不消耗任何东西的东西变得更多。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15647580

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档