1

使用 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

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

4

3 回答 3

3

把它变成一个计算表达式,因为通常这些被视为NULL-able 除非包裹在ISNULL()

WITH    cte ( a )
        AS ( SELECT   CAST(1 AS INT)
        UNION ALL
        SELECT   2
            )
SELECT * INTO a_tmp FROM cte
于 2011-09-27T12:42:53.533 回答
2

如果要在表中显式定义字段为可为空,正确的方法是使用CREATE TABLE.

作为一种解决方法,您可以将所有字段显式转换为它们的数据类型,但对我来说,这似乎不仅仅是工作

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

于 2011-09-27T12:45:22.647 回答
1

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

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

于 2011-09-27T12:46:54.340 回答