使用SQL Server SELECT INTO创建可为空的列?

mat*_*mc3 30 t-sql sql-server

当我使用select intoSQL Server 创建临时表时,有没有办法指定列应该可以为空?我有一个多步骤的过程,我通过选择很多列来制作临时表(这就是我不做的原因create table #tmp (...)).在我创建临时表之后,我正在更新一些列,其中一些更新可能会使某个字段无效.

我知道我可以做一个alter table alter column声明来实现我想要的东西,但我很好奇是否有办法在select自己中指定它.我知道你可以内联cast列以获得所需的数据类型,但我看不出你如何指定可空性.

Cad*_*oux 25

Nullability继承自source列.

您可以通过表达式丢失或获得可空性:

示例(常量文字似乎有问题 - 需要一个可以返回NULL的好的NOOP函数):

CREATE TABLE SO5465245_IN
    (
     a INT NOT NULL
    ,b INT NULL
    ) ;
GO

SELECT  COALESCE(a, NULL) AS a
       ,ISNULL(b, 0) AS b
       ,COALESCE(10, NULL) AS c1
       ,COALESCE(ABS(10), NULL) AS c2
       ,CASE WHEN COALESCE(10, NULL) IS NOT NULL THEN COALESCE(10, NULL) ELSE NULL END AS c3
INTO    SO5465245_OUT
FROM    SO5465245_IN ;
GO

SELECT  TABLE_NAME
       ,COLUMN_NAME
       ,IS_NULLABLE
FROM    INFORMATION_SCHEMA.COLUMNS
WHERE   TABLE_NAME LIKE 'SO5465245%'
ORDER BY TABLE_NAME
       ,ORDINAL_POSITION ;
GO

DROP TABLE SO5465245_IN ;
GO

DROP TABLE SO5465245_OUT ;
GO
Run Code Online (Sandbox Code Playgroud)


Kub*_*tek 12

我最近提出了这个问题,虽然我应该分享:

select top 0
  B.*
into
  TargetTable
from
  SourceTable as A
    left join SourceTable as B on 1 = 0
Run Code Online (Sandbox Code Playgroud)

这有效地创建了一个重复的SourceTablein in 结构,TargetTable所有列都可以为空(至少在sql2008中).


wez*_*zix 6

CONVERT 将使您的列可以为空,并且也适用于文字/常量。在 SQL Server 2005/2008 中测试。

SELECT 
    SomeText = CONVERT(varchar(10), 'literal'),
    SomeNumber = CONVERT(int, 0)
INTO SO5465245

INSERT SO5465245 VALUES (null, null)

SELECT TABLE_NAME, COLUMN_NAME, DATA_TYPE, IS_NULLABLE
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'SO5465245'
ORDER BY TABLE_NAME, ORDINAL_POSITION

DROP TABLE SO5465245
Run Code Online (Sandbox Code Playgroud)