如何保留SELECT INTO后的数据类型



我有一个表T1与一些日期/时间字段。我将这个表上的几个查询与一个UNION查询结合起来,并在UNION上使用SELECT INTO创建了一个新表T2,如下所示:

SELECT * INTO T2
FROM (select * from query1_T1
union
select * from query2_T1)

问题是query1_T1为一些日期字段替换了一个空白字符串常量,这导致T2具有文本字段而不是日期/时间字段。说明:

query1_T1:
select myUDF(someTextField),"" as newDateField from T1
query2_T1:
select anotherUDF(someTextField),oldDateField from T1

其中oldDateField为日期/时间。

是否有一种方法,我可以结构SELECT INTO,或更改query1_T1,这样我仍然会从查询中得到相同的结果,但newDateField将最终作为日期/时间?

始终可以将创建表与向其中添加数据分开。首先,用适当的数据类型定义所有字段。然后使用INSERT INTO (columns) SELECT * FROM填充它。

更新:

或者您可以使用混合方法。首先用SELECT INTO,没有行:

SELECT * INTO T2
FROM query2_T1
WHERE 1=0

这将创建你的大部分结构。然后,您可以手动调整任何没有正确通过的数据类型。

调整好结构后,您可以安全地执行此操作:

INSERT INTO T2 
SELECT * FROM query1_T1
UNION 
SELECT * FROM query2_T1

您可以通过简单的

解决这个问题。
  • query1_T1更改为返回Null而不是空字符串作为第二列,并且

  • 将您联合在一起的查询的顺序颠倒

,

SELECT * INTO T2
FROM 
(
select * from query2_T1
UNION ALL
select * from query1_T1
)

这样,当T2的表结构由第一个union查询确定时,第二列包含一些日期值,并且第二个查询不会在之后强制该列为Text。

我没有在Access中尝试过,但是您可以在几乎任何其他数据库中使用cast()。Access中的对应函数是cdate()。试一试:

cdate(NULL) as newDateField

如果你需要一个实际的值,那么像这样:

cdate('1900-01-01')

最新更新