2017-05-31 41 views
0

我正在運行使用ACE OLEDB而不連接到Access的VBA中的SQL查詢。我這樣做,所以我可以快速粉碎一些Excel表格。我不想將這個轉換到另一個平臺,所以寧願解決當前的問題。VBA/ACE OLEDB/SQL運行時錯誤-2147217913標準表達式中的數據類型不匹配

VBA代碼工作沒有問題,衆多的查詢,但我跑進提到的錯誤以下查詢:

SELECT 
    bcr.DialCode, 
    bcr.Destination, 
    (
     SELECT 
      TOP 1 cc.CountryCode 
     FROM 
      table2 AS cc 
     WHERE 
      bcr.DialCode LIKE cc.CountryCode+'%' 
     ORDER BY LEN(cc.CountryCode) DESC 
    ) AS CountryCodes 
FROM 
    table1 AS bcr 

代碼改編自:Longest prefix match in SQL Server 2000

意圖是撥打的電話號碼匹配尋找最具包容性的比賽。重用輸入引用文本樣本和預期結果(適應這種運動):

bcr.DialCode = '0841234567' 

cc.CountryCode = {'084', 
       '0841', 
       '08412'} 

Expected output = {'0841234567','Destination 1','08412'} 

從網上搜索看起來也許我在查詢中使用保留字。但我已經單獨測試了查詢的不同部分,並沒有得到任何錯誤。例如:

SELECT 
    bcr.DialCode, 
    bcr.Destination 
FROM 
    table1 AS bcr 

按預期工作。另外:

SELECT 
    TOP 1 cc.CountryCode 
FROM 
    table2 AS cc 
WHERE 
    cc.CountryCode LIKE '1'+'%' 
ORDER BY LEN(cc.CountryCode) DESC 

沒有錯誤並輸出預期結果。

用於將查詢傳遞給ADO連接的變量以String形式變暗,但我嘗試將設置設置爲Variant而不做任何更改。

在「最長前綴匹配」查詢不起作用的情況下,通過ACE實現SQL可能有區別嗎?任何指導將不勝感激。

+0

子查詢'bcr.DialCode LIKE cc.CountryCode +'%''我認爲他們需要是另一種方式?並嘗試使用*作爲通配符。 –

+1

ACE/OleDb數據庫引擎不知道[%]。您必須將其替換爲[*]。 –

+0

感謝您的指示。查詢確實可以通過cc.CountryCode LIKE'1'+'%'(按照上面提供的第三個查詢)來工作。它輸出所有以'1'開始並且最大LEN爲4的國家代碼。我試着用'*'和'[*]'改變'%'的錯誤。嘗試用'[*]'修改''%''並得到「沒有給出一個或多個所需參數的值」。任何其他想法? – nbayly

回答

1

首先,請閱讀我對該問題的評論。

其次,請閱讀以下文章:

I get a message about data type mismatch

MS Access 2003: LIKE condition (using wildcards)

最後,如果你想一個數據比較的工具,其StartsWith("SomeString"),你可以使用這樣的事情:

SELECT 
    bcr.DialCode, 
    bcr.Destination, 
    cc.CountryCode 
FROM table1 AS bcr 
    INNER JOIN table2 AS cc 
    ON cc.CountryCode = LEFT(bcr.DialCode, LEN(cc.CountryCode)) 
ORDER BY LEN(cc.CountryCode) DESC; 

欲瞭解更多詳情,請參閱:MS Access: Left Function

注意:不要忘記在查詢結束時使用[;]。 MS Access數據庫喜歡它;)

+0

感謝您的進一步回覆。使用你提供的代碼,我得到一個「這個子查詢最多可以返回一條記錄。」錯誤。它應該與Table1中的行產生儘可能多的匹配,因爲所有的通話都會匹配至少一個國家。這甚至被認爲是一個實際的LEFT JOIN?我是否應該將它改爲使用LEFT JOIN,而不是我遵循的解決方案? – nbayly

+0

@nbayly,檢查更新的答案。這應該返回'CountryCode'開頭的所有數據'DialCode'。祝你好運! –

+0

這現在運行沒有錯誤,但有一些與查詢的邏輯問題,我希望你可以幫助。它不輸出最具包容性的比賽。例如,對於撥號代碼'7708',它與俄羅斯撥號代碼'7'匹配,而不是比較包含'77'的哈薩克斯坦。有什麼建議麼?我將你的答案標記爲正確,因爲它解決了運行時錯誤。 – nbayly

相關問題