如何使用insert创建表,以便列可以为空?

时间:2011-09-27 12:40:07

标签: sql sql-server-2008 create-table

使用SQL Server 2008。

以下是我的问题的简化示例:

WITH    cte ( a )
          AS ( SELECT   1
               UNION ALL
               SELECT   NULL
             )
SELECT * INTO a_tmp FROM cte

SELECT * FROM a_tmp

这将创建一个名为a_tmp的表,其中包含一个可为空的int列。

然而,下一个代码片段会创建一个包含不可为空的列的表:

WITH    cte ( a )
        AS ( SELECT   1
        UNION ALL
        SELECT   2
            )
SELECT * INTO a_tmp FROM cte

如何更改第二个代码段以强制创建表,其所有列都可以为空?

3 个答案:

答案 0 :(得分:3)

将其设为计算表达式,因为通常这些表达式被视为NULL - 除非包含在ISNULL()

WITH    cte ( a )
        AS ( SELECT   CAST(1 AS INT)
        UNION ALL
        SELECT   2
            )
SELECT * INTO a_tmp FROM cte

答案 1 :(得分:2)

如果要在表格中明确将字段定义为可为空,正确方式是使用CREATE TABLE

作为一种解决方法,您可以明确地将所有字段转换为其数据类型,但对我来说,似乎只是工作而不仅仅是

CREATE TABLE MyTable (id INT NULL, Otherfield varchar(100)...)

答案 2 :(得分:1)

当您使用SELECT ... INTO时,任何使用内置函数的表达式(例如CAST)都被引擎视为NULL。

因此,如果您使用CAST(somecol as int),则表达式为NULLable。