使用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
如何更改第二个代码段以强制创建表,其所有列都可以为空?
答案 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。