如何在基于文字的列的SELECT INTO中控制可空性

Blu*_*kMN 11 sql t-sql sql-server-2008

我注意到当我使用此语句时,该Action列不可为空:

SELECT TOP 0 SerialNumber, 0 [Action] INTO #MyTable FROM FSE_SerialNumber
Run Code Online (Sandbox Code Playgroud)

但是当我使用这个语句时,该Action列可以为空:

SELECT TOP 0 SerialNumber, CAST(0 as int) [Action] INTO #MyTable FROM FSE_SerialNumber
Run Code Online (Sandbox Code Playgroud)

我以这种方式创建表的原因是因为我不希望临时表从服务器默认排序规则或其他地方继承SerialNumber的排序规则.我希望它匹配FSE_SerialNumber..SerialNumber的排序规则.

我的问题是,我可以依靠演员函数给我一个可以为空的列,或者这个没有明确定义并且可能会改变.为什么演员突然使列可以为空?有没有更好的方法(除了评论)澄清我的意图是在那里获得一个可以为空的列?

Gil*_*ilM 12

它看起来像一个明确的答案是在这里.在这里复制:

元数据是根据SELECT列表中使用的源列和表达式确定的.以下是规则:

  1. 任何使用内置函数的表达式,例如SUBSTRING,LEFT,RIGHT等(除了ISNULL)都被引擎认为是NULLable.因此,如果您使用CAST(somecol作为char(8)),则表达式为NULLable

  2. 文字,常量,全局变量(如@@ DBTS,@@ ERROR等)被认为是非NULL的,因为它们总是返回一些值

  3. 如果expression是一列,那么可以从源列元数据派生出可为空性

    因此,要使SELECT列表中的表达式或列不为null,请在列或表达式周围使用ISNULL.

因此,您可以安全地使用CAST表达式.


AjV*_*Jsy 5

快速一般提示SELECT ... INTOISNULL(与列一起使用,它将在表中创建为 NOT NULL 列。

  • 我将永远感激这个答案。给我点赞:) (2认同)