如何在SELECT INTO后保留数据类型?

时间:2013-05-02 16:46:34

标签: sql ms-access

我有一个表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最终将作为日期/时间?

3 个答案:

答案 0 :(得分:5)

您始终可以单独创建表,而不是将数据添加到表中。首先,使用适当的数据类型定义所有字段。然后使用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

答案 1 :(得分:2)

您只需

即可解决此问题
  • query1_T1更改为返回Null而不是空字符串作为第二列,

  • 将UNION的查询顺序颠倒过来

即,

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

这样,当T2的表结构由第一个UNIONed查询确定时,第二列包含一些日期值,第二个查询不会强制该列之后的文本。 / p>

答案 2 :(得分:1)

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

cdate(NULL) as newDateField

如果你需要一个实际值,那么就像:

cdate('1900-01-01')