当我在SQL Server中使用select into
创建临时表时,有没有办法指定列应该可以为空?我有一个多步骤的过程,我通过选择很多列来制作临时表(这就是为什么我没有做create table #tmp (...)
)。在我创建临时表之后,我正在更新一些列,其中一些更新可能会使字段无效。
我知道我可以做一个alter table alter column
语句来实现我想要的,但我很好奇是否有办法在select
本身中指定它。我知道你可以内联cast
列来获得所需的数据类型,但我看不出你如何指定可空性。
答案 0 :(得分:25)
Nullability继承自源列。
您可以通过表达式丢失或获得可空性:
示例(常量文字似乎有问题 - 需要一个可以返回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
答案 1 :(得分:11)
我最近提出了这个问题,虽然我应该分享:
select top 0
B.*
into
TargetTable
from
SourceTable as A
left join SourceTable as B on 1 = 0
这有效地在SourceTable
中创建TargetTable
的重复结构,所有列都可以为空(至少在sql2008中)。
答案 2 :(得分:2)
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
答案 3 :(得分:1)
如果您想继承目标列的nullablity而不考虑源表列,则可以按照此查询进行操作。
SELECT COLUMN1, COLUMN2, COLUMN3 INTO DestinationTable from SourceTable
如果这是您的查询,其中COLUMN1,COLUMN2,COLUMN3在SourceTable中不可为空,则将查询更改为
SELECT NULL COLUMN1, NULL COLUMN2, NULL COLUMN3 INTO DestinationTable from SourceTable
因此,这将允许您将空值插入Destination表。
答案 4 :(得分:1)
这也有效。
select *
into #so20150909
from table
where 1=0
答案 5 :(得分: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]
问候。