繁体   English   中英

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

[英]Create a nullable column using SQL Server SELECT INTO?

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

我知道我可以做一个alter table alter column语句来实现我想要的,但我很好奇是否有办法在select本身中指定它。 我知道你可以内嵌cast列以获得所需的数据类型,但我看不出你如何指定为空性。

可空性是从源列继承的。

您可以使用表达式失去或获得可空性:

示例(常量文字似乎有问题 - 需要一个可以返回 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

我最近想出了这个解决方案,尽管我应该分享:

select top 0
  B.*
into
  TargetTable
from
  SourceTable as A
    left join SourceTable as B on 1 = 0

这有效地在TargetTable创建了SourceTable的重复结构,其中所有列TargetTable空(至少在 sql2008 中)。

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

如果您想为目标列继承可空性而不管源表列,您可以遵循此查询。

SELECT COLUMN1, COLUMN2, COLUMN3 INTO DestinationTable from SourceTable

如果这是您的查询,其中 COLUMN1、COLUMN2、COLUMN3 在 SourceTable 中不可为空,则将查询更改为

SELECT NULL COLUMN1, NULL COLUMN2, NULL COLUMN3 INTO DestinationTable from SourceTable

因此,这将允许您将空值插入到 Destination 表中。

这也可以。

select *
into #so20150909
from table
where 1=0

我最近遇到了同样的问题 - 我想使用“select into”,希望目标表中的所有列都可以为空,并且是一种可重复的方法,我不必知道源表中字段的名称。

select *
into dbo.I_Data
from
  (select 1[Z_1]) A
  full join (select null[Z_2], * from dbo.S_Data) B on A.Z_1 = B.Z_2

其中 dbo.S_Data 是源数据表,[Z_ 1] & [Z _2] 是用于连接的两个虚拟列

然后清理:

(a) 删除空行

delete dbo.I_Data where [Z_1] = 1

(b) 删除虚拟字段:

alter table dbo.I_Data 
  drop column [Z_1], [Z_2]

问候。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM