2017-08-25 76 views
2

我是數據庫新手,並從我們的數據庫人員那裏得到了這個查詢。不幸的是他的最後一天是昨天。當我在Oracle SQL Developer中運行查詢時,它可以在不到一秒的時間內返回20條記錄,但是當我在Excel VBA中嘗試它時,它會給我第一個運行時錯誤'-2147217900(80040e14)'行上的自動化錯誤。打開StrQuery,cnn「。SQL查詢中的Excel VBA自動化錯誤

這是我的代碼。

'Initializes variables 
Dim cnn As New ADODB.Connection 
Dim rst As New ADODB.Recordset 
Dim ConnectionString As String 
Dim StrQuery As String 

'Setup the connection string for accessing MS SQL database 
ConnectionString = "Provider=OraOLEDB.Oracle;Password=XXXXX;User ID=XXXXX;Data Source=XXXXX;" 

'Opens connection to the database 
cnn.Open ConnectionString 
'Timeout error in seconds for executing the entire query 
cnn.CommandTimeout = 90 

'Query String 
StrQuery = "SELECT " 
StrQuery = StrQuery & "distinct dbo.mfg_order.mfg_order_name, " 
StrQuery = StrQuery & "dbo.mfg_order.mfg_bill_letter, " 
StrQuery = StrQuery & "dbo.mfg_order.mfg_order_name || '-' || dbo.mfg_order.mfg_bill_letter as mfg_order_bill, " 
StrQuery = StrQuery & "dbo.pcb_header.position_seq_nbr || '00', " 
StrQuery = StrQuery & "D2.mfg_catg as catg,D2.mfg_catg_value as catgvalue " 
StrQuery = StrQuery & "FROM " 
StrQuery = StrQuery & "dbo.sales_order, " 
StrQuery = StrQuery & "dbo.planned_shipment, " 
StrQuery = StrQuery & "dbo.eco_include_exclude, " 
StrQuery = StrQuery & "dbo.mfg_note_header, " 
StrQuery = StrQuery & "dbo.pcb_subset, " 
StrQuery = StrQuery & "dbo.pcb_detail D2, " 
StrQuery = StrQuery & "dbo.pcb_header, " 
StrQuery = StrQuery & "dbo.mfg_order " 
StrQuery = StrQuery & "WHERE " 
StrQuery = StrQuery & "(dbo.mfg_order.mfg_order_name = dbo.pcb_header.mfg_order_name) and " 
StrQuery = StrQuery & "(dbo.mfg_order.mfg_bill_letter = dbo.pcb_header.mfg_bill_letter) and " 
StrQuery = StrQuery & "(dbo.mfg_order.mfg_order_revision = dbo.pcb_header.mfg_order_revision) and " 
StrQuery = StrQuery & "(dbo.mfg_order.planned_shipment_nbr = dbo.planned_shipment.planned_shipment_nbr (+)) and " 
StrQuery = StrQuery & "(dbo.mfg_order.sales_ord_id = dbo.planned_shipment.sales_ord_id (+)) and " 
StrQuery = StrQuery & "(dbo.mfg_order.sales_ord_id = dbo.sales_order.sales_ord_id (+)) and " 
StrQuery = StrQuery & "(dbo.pcb_header.pcb_header_id = dbo.pcb_subset.pcb_header_id (+)) and " 
StrQuery = StrQuery & "(dbo.mfg_order.mfg_order_name = dbo.eco_include_exclude.mfg_order_name (+)) and " 
StrQuery = StrQuery & "(dbo.mfg_order.mfg_bill_letter = dbo.eco_include_exclude.mfg_bill_letter (+)) and " 
StrQuery = StrQuery & "(dbo.mfg_order.mfg_order_revision = dbo.eco_include_exclude.mfg_order_revision (+)) and " 
StrQuery = StrQuery & "(dbo.mfg_order.mfg_order_name = dbo.mfg_note_header.mfg_order_name (+)) and " 
StrQuery = StrQuery & "(dbo.mfg_order.mfg_bill_letter = dbo.mfg_note_header.mfg_bill_letter (+) ) and " 
StrQuery = StrQuery & "(dbo.mfg_order.mfg_order_revision = dbo.mfg_note_header.mfg_order_revision (+)) and " 
StrQuery = StrQuery & "(dbo.pcb_header.pcb_header_id = D2.pcb_header_id) and " 
StrQuery = StrQuery & "dbo.mfg_order.bu_mfg_loc_id = 5 AND " 
StrQuery = StrQuery & "dbo.pcb_header.prod_code='0050' AND " 
StrQuery = StrQuery & "dbo.mfg_order.mfg_order_type = 'SO' and " 
StrQuery = StrQuery & "dbo.pcb_header.mfg_prod_grp = 'FN05' AND " 
StrQuery = StrQuery & "(D2.mfg_catg = 'FSIZ') AND " 
StrQuery = StrQuery & "D2.MFG_CATG_VALUE='28FB' AND " 
StrQuery = StrQuery & "dbo.mfg_order.MFG_BILL_LETTER='A' AND " 
StrQuery = StrQuery & "LENGTH(dbo.mfg_order.MFG_ORDER_NAME)=7;" 

'Check Query 
Debug.Print StrQuery 

'Performs the actual query  
rst.Open StrQuery, cnn 

'Dumps all the results from the StrQuery into cell A2 of the first sheet in the active workbook 
'Sheets(1).Range("A2").CopyFromRecordset rst 
End Sub 

調試給我查詢:

SELECT distinct dbo.mfg_order.mfg_order_name, dbo.mfg_order.mfg_bill_letter, dbo.mfg_order.mfg_order_name || '-' || dbo.mfg_order.mfg_bill_letter as mfg_order_bill, dbo.pcb_header.position_seq_nbr || '00', D2.mfg_catg as catg,D2.mfg_catg_value as catgvalue FROM dbo.sales_order, dbo.planned_shipment, dbo.eco_include_exclude, dbo.mfg_note_header, dbo.pcb_subset, dbo.pcb_detail D2, dbo.pcb_header, dbo.mfg_order WHERE (dbo.mfg_order.mfg_order_name = dbo.pcb_header.mfg_order_name) and (dbo.mfg_order.mfg_bill_letter = dbo.pcb_header.mfg_bill_letter) and (dbo.mfg_order.mfg_order_revision = dbo.pcb_header.mfg_order_revision) and (dbo.mfg_order.planned_shipment_nbr = dbo.planned_shipment.planned_shipment_nbr (+)) and (dbo.mfg_order.sales_ord_id = dbo.planned_shipment.sales_ord_id (+)) and (dbo.mfg_order.sales_ord_id = dbo.sales_order.sales_ord_id (+)) and (dbo.pcb_header.pcb_header_id = dbo.pcb_subset.pcb_header_id (+)) and (dbo.mfg_order.mfg_order_name = dbo.eco_include_exclude.mfg_order_name (+)) and (dbo.mfg_order.mfg_bill_letter = dbo.eco_include_exclude.mfg_bill_letter (+)) and (dbo.mfg_order.mfg_order_revision = dbo.eco_include_exclude.mfg_order_revision (+)) and (dbo.mfg_order.mfg_order_name = dbo.mfg_note_header.mfg_order_name (+)) and (dbo.mfg_order.mfg_bill_letter = dbo.mfg_note_header.mfg_bill_letter (+) ) and (dbo.mfg_order.mfg_order_revision = dbo.mfg_note_header.mfg_order_revision (+)) and (dbo.pcb_header.pcb_header_id = D2.pcb_header_id) and dbo.mfg_order.bu_mfg_loc_id = 5 AND dbo.pcb_header.prod_code='0050' AND dbo.mfg_order.mfg_order_type = 'SO' and dbo.pcb_header.mfg_prod_grp = 'FN05' AND (D2.mfg_catg = 'FSIZ') AND D2.MFG_CATG_VALUE='28FB' AND dbo.mfg_order.MFG_BILL_LETTER='A' AND LENGTH(dbo.mfg_order.MFG_ORDER_NAME)=7; 

這是多一點的人可讀的(無論是在SQL開發人員,這些工作之一):

SELECT 
distinct dbo.mfg_order.mfg_order_name, 
dbo.mfg_order.mfg_bill_letter, 
dbo.mfg_order.mfg_order_name || '-' || dbo.mfg_order.mfg_bill_letter as mfg_order_bill, 
dbo.pcb_header.position_seq_nbr || '00', 
D2.mfg_catg as catg,D2.mfg_catg_value as catgvalue 
FROM 
dbo.sales_order, 
dbo.planned_shipment, 
dbo.eco_include_exclude,  
dbo.mfg_note_header, 
dbo.pcb_subset, 
dbo.pcb_detail D2, 
dbo.pcb_header, 
dbo.mfg_order 
WHERE 
(dbo.mfg_order.mfg_order_name = dbo.pcb_header.mfg_order_name) and 
(dbo.mfg_order.mfg_bill_letter = dbo.pcb_header.mfg_bill_letter) and 
(dbo.mfg_order.mfg_order_revision = dbo.pcb_header.mfg_order_revision) and 
(dbo.mfg_order.planned_shipment_nbr = dbo.planned_shipment.planned_shipment_nbr (+)) and 
(dbo.mfg_order.sales_ord_id = dbo.planned_shipment.sales_ord_id (+)) and 
(dbo.mfg_order.sales_ord_id = dbo.sales_order.sales_ord_id (+)) and 
(dbo.pcb_header.pcb_header_id = dbo.pcb_subset.pcb_header_id (+)) and 
(dbo.mfg_order.mfg_order_name = dbo.eco_include_exclude.mfg_order_name (+)) and 
(dbo.mfg_order.mfg_bill_letter = dbo.eco_include_exclude.mfg_bill_letter (+)) and 
(dbo.mfg_order.mfg_order_revision = dbo.eco_include_exclude.mfg_order_revision (+)) and 
(dbo.mfg_order.mfg_order_name = dbo.mfg_note_header.mfg_order_name (+)) and 
(dbo.mfg_order.mfg_bill_letter = dbo.mfg_note_header.mfg_bill_letter (+) ) and 
(dbo.mfg_order.mfg_order_revision = dbo.mfg_note_header.mfg_order_revision (+)) and 
(dbo.pcb_header.pcb_header_id = D2.pcb_header_id) and 
dbo.mfg_order.bu_mfg_loc_id = 5 AND 
dbo.pcb_header.prod_code='0050' AND 
dbo.mfg_order.mfg_order_type = 'SO' and 
dbo.pcb_header.mfg_prod_grp = 'FN05' AND 
(D2.mfg_catg = 'FSIZ') AND 
D2.MFG_CATG_VALUE='28FB' AND 
dbo.mfg_order.MFG_BILL_LETTER='A' AND 
LENGTH(dbo.mfg_order.MFG_ORDER_NAME)=7; 
+0

是否查詢選擇任何罕見的數據類型,例如'LONG','CLOB','TIMESTAMP'? –

+0

一切都是一個字符串或一個整數。 –

+0

您是否爲32位安裝了Oracle客戶端和oledb提供程序? –

回答

0

我想你錯過別名dbo.pcb_header.position_seq_nbr || '00'

嘗試

dbo.pcb_header.position_seq_nbr || '00' AS position_seq, 

試試這樣說:

'Initializes variables 
Dim cnn As New ADODB.Connection 
Dim rst As New ADODB.Recordset 
DIM cmd As New ADODB.Command 
Dim ConnectionString As String 
Dim StrQuery As String 

'Setup the connection string for accessing MS SQL database 
ConnectionString = "Provider=OraOLEDB.Oracle;Password=XXXXX;User ID=XXXXX;Data Source=XXXXX;" 

cnn.Provider = "OraOLEDB.Oracle" 
cnn.CursorLocation = adUseClient 


'Opens connection to the database 
cnn.Open ConnectionString 
'Timeout error in seconds for executing the entire query 
cnn.CommandTimeout = 90 

Set cmd.ActiveConnection = con 
Set rst.Source = cmd 
rst.CursorType = adOpenStatic 

'Query String 
StrQuery = "SELECT " 
... 

cmd.CommandText = StrQuery 
rst.Open 
+0

這沒有奏效。同樣的錯誤。 –

+0

請參閱我的更新 –

+0

我假設在設置cmd.ActiveConnection = con你的意思是「cnn」而不是「con」,但仍然沒有工作。完全相同的錯誤在rst.open。 –