13

我注意到,当我使用此语句时,该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 的排序规则相匹配。

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

4

3 回答 3

17

看起来肯定的答案就在这里。复制到这里:

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

  1. 例如,任何使用内置函数(如 SUBSTRING、LEFT、RIGHT 等(ISNULL 除外)的表达式)都被引擎视为 NULLable。所以如果你使用 CAST(somecol as char(8)) 那么表达式是 NULLable

  2. 文字、常量、@@DBTS、@@ERROR 等全局变量被认为是不可为空的,因为它们总是返回一些值

  3. 如果表达式是列,则可空性派生自源列元数据

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

所以,看起来你可以安全地使用你的 CAST 表达式。

于 2012-08-08T20:33:59.690 回答
6

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

于 2018-01-25T18:01:46.673 回答
0

就个人而言,为了获得最佳控制,您应该首先创建表。例如:

Create Table #MyTable (
   SerialNumber int Not Null, -- or however this is correctly defined.
   Action int Null
)

然后,做一个插入...选择从...

Insert Into #MyTable(SerialNumber, Action)
Select SerialNumber, 0
From FSE_SerialNumber

然后,就不会有字段应该是什么的问题。

我知道这不是您所要求的,但可能需要考虑。

于 2012-08-08T20:04:26.007 回答