Jas*_*son 7 sql t-sql sql-server null
我今天遇到了与此类似的代码.
SELECT AuditDomain,
ObjectId,
AuditSubdomain = CONVERT(VARCHAR(50), NULL),
SubDomainObjectId = CONVERT(INT, NULL)
FROM Audit
Run Code Online (Sandbox Code Playgroud)
这似乎意味着数据类型信息可以与NULL值相关联.这是否将元数据附加到NULL值,将其标识为指定的数据类型?
这篇文章详细介绍了在Sql Server中查找数据类型的方法,但是当我尝试以下行时,它返回为NULL:
SELECT CAST(SQL_VARIANT_PROPERTY(CONVERT(INT, NULL), 'BaseType') AS VARCHAR(20))
Run Code Online (Sandbox Code Playgroud)
Aar*_*and 13
在SQL Server中,NULL
是INT
在默认情况下所有我能想到的场景.您可以使用以下代码确定:
SELECT x = NULL INTO #x;
EXEC tempdb..sp_columns '#x';
Run Code Online (Sandbox Code Playgroud)
结果:
TABLE_QUALIFIER TABLE_OWNER TABLE_NAME COLUMN_NAME DATA_TYPE TYPE_NAME
--------------- ----------- ---------- ----------- --------- ---------
tempdb dbo #x___... x 4 int
Run Code Online (Sandbox Code Playgroud)
在您将其放入表格或以其他方式与某些上下文元数据相关联之前,这会给您带来什么?它是什么区别INT
或它是什么区别DATETIME
?您将如何处理这些信息?
SQL_VARIANT_PROPERTY
返回,NULL
因为它似乎要求元数据和值都有意义.观察(使用不同的类型只是为了混合它):
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');
Run Code Online (Sandbox Code Playgroud)
结果:
NULL
NULL
date
Run Code Online (Sandbox Code Playgroud)
所以它似乎需要一个类型和一个值才能准确地确定基类型.
至于为什么它以这种方式工作,耸耸肩.您必须向人们询问源代码访问权限.
请注意,NULL
当您强制使用SQL Server时,只需要采用基类型:您已经基于它创建了一个表.很可能SQL Server会在这种情况下返回错误(实际上很多情况下它必须猜测你的数据类型).避免这种情况的方法是不要创建SQL Server必须猜测的情况(这就是为什么我问,你将如何处理这些信息?).