UNION ALL查询导致类型转换错误,但UNION没有

时间:2013-05-07 23:47:04

标签: sql ms-access

当我运行以下查询时:

INSERT INTO outRawTbl
SELECT *
FROM (select * from [out|noRFI_BS_noRT]
union all
select * from [out|noRFI_BS_RT])  AS [%$##@_Alias];

我收到此错误:

Microsoft Access set 3854 field(s) to Null due to a type conversion failure

当我将查询运行为:

INSERT INTO outRawTbl
SELECT *
FROM (select * from [out|noRFI_BS_noRT]
union
select * from [out|noRFI_BS_RT])  AS [%$##@_Alias];

然后我没有得到这种类型转换错误,并且所有数据都成功插入。我需要使用UNION ALL,因为查询中的某些字段是备注字段,如果我使用UNION,它们将被截断为255个字符。

我想我可以开始尝试从查询中一次插入一个字段,但每个查询中大约有50个字段,这将花费大量时间。有没有一种快速的方法可以找出导致UNION ALL问题的字段?

编辑: 解决并发现了另一个问题。我认为Gordon的想法是将查询作为单独的INSERT操作而不是使用UNION ALL来运行。然后我遍历查询中的每个字段,使用以下代码执行单独的插入以查找导致转换错误的字段:

Sub findProblemField()

Dim qdf As QueryDef
Dim sql As String
Dim fld As Field   

For Each qdf In CurrentDb.QueryDefs
    If InStr(qdf.Name, "out|") Then
        For Each fld In qdf.Fields
            sql = "insert into outrawtbl select top 1 " & _
                    "[" & qdf.Name & "].[" & fld.Name & "] from [" & qdf.Name & "]"
            CurrentDb.Execute sql, dbFailOnError
        Next
    End If
Next

End Sub

这让我发现SELECT查询中的字符串之一是目标字段中的日期/时间,空字符串值是抛出错误的内容。正在努力解决这个问题......

1 个答案:

答案 0 :(得分:4)

我不知道为什么MS Access会因union all而导致union失败。它应该产生相同的数据。我也不知道为什么备忘录字段会在一种情况下被截断,而不会截断另一种情况。

但是,使用union all解决问题的最简单方法是执行两次插入:

INSERT INTO outRawTbl
select * from [out|noRFI_BS_noRT];

insert into outRawTbl
select * from [out|noRFI_BS_RT];