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

问题描述 投票:0回答:4

我注意到,当我使用此语句时,

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.

的排序规则匹配

我的问题是,我可以依靠强制转换函数给我一个可为空的列,还是这没有明确定义并且可能会改变。为什么强制转换突然使该列可以为空?有没有更好的方法(除了注释之外)来澄清我的意图是在那里获得一个可为空的列?

sql sql-server-2008 tsql
4个回答
18
投票

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

元数据根据源列和使用的表达式确定 在选择列表中。规则如下:

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

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

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

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

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


6
投票

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


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

那么就不存在字段应该是什么的问题了。

我知道这并不完全是你所要求的,但这可能是值得考虑的事情。


0
投票

对我来说,我希望将

Select Into...
的结果列修剪为新的数据长度并且不为 NULL。

所以我正在做

select left(isnull(col2, ''), 10)...
,这不起作用。

left/isnull
函数需要反转,将isnull作为最外层操作

select isnull(left(col2, 10), '')...

© www.soinside.com 2019 - 2024. All rights reserved.