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

时间:2012-08-08 19:50:37

标签: sql sql-server-2008 tsql

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

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

3 个答案:

答案 0 :(得分:11)

看起来确定的答案是here。在这里复制:

  

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

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

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

  4.   
  5. 如果表达式是一列,则可以从源列元数据

    派生出可为空性      

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

  6.   

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

答案 1 :(得分:2)

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

答案 2 :(得分: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

然后,毫无疑问这些字段应该是什么。

我知道这不是你提出的要求,但可能需要考虑。