小编典典

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

sql

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

SELECT TOP 0 SerialNumber, 0 [Action] INTO #MyTable FROM FSE_SerialNumber

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

SELECT TOP 0 SerialNumber, CAST(0 as int) [Action] INTO #MyTable FROM FSE_SerialNumber

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

我的问题是,我可以依靠强制转换函数为我提供可为空的列,还是这个定义不明确并且可能会更改。为什么强制转换突然使列为空?是否有更好的方法(除注释外)来说明我的意图是在那里获取可为空的列?


阅读 173

收藏
2021-03-23

共1个答案

小编典典

似乎在这里有一个明确的答案。复制到这里:

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

1.
例如,使用内置函数(例如SUBSTRING,LEFT,RIGHT等)的任何表达式(ISNULL除外)都被引擎视为可为NULL。因此,如果您使用CAST(somecol
as char(8)),则表达式可以为NULLable

  1. 文字,常量,全局变量(如@@ DBTS,@@ ERROR等)被视为不可为空,因为它们总是返回一些值

  2. 如果expression是一个列,则从源列元数据中得出可为空性

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

因此,看起来您可以安全使用CAST表达式。

2021-03-23