2013-05-07 2 views
0

Когда я запускаю следующий запрос:UNION ALL запрос вызывает ошибку преобразования типов, но UNION не

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, потому что некоторые из полей в запросах являются полями Memo, и они будут усечены до 255 символов, если я использую UNION.

Я думаю, я могу начать пытаться вставлять поля по одному из запросов, но в каждом запросе есть около 50 полей, и это займет много времени. Есть ли быстрый способ узнать, какое поле вызывает проблему с UNION ALL?

EDIT: Решенная и непокрытая другая проблема. Я принял идею Гордона о выполнении запросов как отдельных операций 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. Он должен давать одни и те же данные. Я также не знаю, почему поле memo будет усечено в одном случае, но не в другом.

Однако самый простой способ решить проблему с union all чтобы сделать две вставки:

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

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

Причина, почему 'UNION' обрезает Memo поля является то, что он выполняет' DISTINCT' на запросе, а это означает, что он группируется во всех полях. Поля Memo не могут быть сгруппированы, поэтому Access передает их в Text. – sigil

+0

@sigil. , , Я думаю, что большинство других баз данных генерируют ошибку в этой ситуации, а не изменяют тип. Тем не менее, он дает подсказку о различии между «union» и «union all», которые объясняют вашу оригинальную проблему. Тем временем, выполнение двух вставок также может решить проблему. –

+0

Я сейчас тестирую ваш подход. – sigil

Смежные вопросы