2013-05-07 146 views
0

當我運行以下查詢:UNION ALL查詢導致類型轉換錯誤,但聯盟不

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查詢是目標字段中的日期/時間,並且空白字符串值是拋出錯誤的內容。努力解決這個現在...

回答

3

我不知道爲什麼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]; 
+1

爲什麼'UNION'截斷備註字段是它執行的查詢'DISTINCT',這意味着其原因它在所有領域分組。備註字段不能分組,所以Access將它們轉換爲文本。 – sigil 2013-05-08 15:50:05

+0

@sigil。 。 。我認爲大多數其他數據庫在這種情況下會產生錯誤,而不是改變類型。然而,它確實提供瞭解釋你原來的問題的'union'和'union all'之間的區別。同時,做兩個插入也可以解決問題。 – 2013-05-08 16:04:35

+0

我正在測試你的方法。 – sigil 2013-05-08 16:22:10