2011-04-03 92 views
0

我目前正在編寫基於Jet數據庫後端的基於VBA的Excel加載項(我使用Office 2003套件 - 問題會無論如何,與最新版本的Office一樣)。Jet引擎(訪問):將值列表傳遞給存儲過程

在我的應用程序的初始化過程中,我創建了在文本文件中定義的存儲過程。這些程序在需要時由我的應用程序調用。

讓我舉一個簡單的例子來描述我的問題:假設我的應用程序允許最終用戶選擇他們想要的詳細信息的訂單標識符。下面是表的定義:

表tblOrders:訂單LONG,訂購日期DATE,(其它領域)

最終用戶可以選擇一個或多個OrderIDs,在表單中顯示的 - 他/她剛必須勾選相關OrderID的複選框,以瞭解其詳細信息(OrderDate等)。

SELECT * FROM tblOrders WHERE OrderID = 1 OR OrderID = 2 OR OrderID = 3 

因爲我事先不知道有多少的OrderID他/她會選擇做什麼,我可以動態地通過級聯基於表單上做出的選擇WHERE子句創建的VBA代碼的SQL查詢

,或者更簡單,使用IN關鍵字:

SELECT * FROM tblOrders WHERE OrderID IN (1,2,3) 

現在,如果我把這個簡單的查詢到存儲過程中,這樣我可以動態傳遞OrderIDs我想要顯示的列表中,我應該怎麼辦?我已經嘗試過的東西,如:

CREATE PROCEDURE spTest (@OrderList varchar) AS 
    SELECT * FROM tblOrders WHERE OrderID IN (@OrderList) 

但是,這並不工作(我期待的是),因爲@OrderList被解釋爲一個字符串(如「1,2,3」),而不是隻要值的列表。 (我改編自這裏的代碼:Passing a list/array to SQL Server stored procedure

我想盡量避免通過純VBA代碼處理這個問題(即動態地將值列表分配給在我的應用程序中硬編碼的查詢)。我會理解,如果這是不可能的。

任何線索?

+0

只是一個額外的精度:我已經看了以下線索「將一組ID傳遞給存儲過程」以及這裏給出的解釋:「http://www.sommarskog.se/arrays-in-sql.html」,但這些僅適用於SQL Server。 – VBAFred 2011-04-03 13:38:29

回答

1

您可以動態創建查詢語句字符串。在SQL Server中,可以有一個函數,其返回值是一個TABLE,並將該函數內聯調用,就像它是一個表一樣。或者在JET中,您還可以創建一個kludge - 一個臨時表(或用於提供臨時表功能的持久表),其中包含列表中的值,每行一個值,並加入該表。因此查詢將是一個兩步驟的過程:1)使用INLIST值填充臨時表,然後2)執行加入臨時表的查詢。

 MYTEMPTABLE 
     autoincrementing id 
     QueryID [some value to identify the current query, perhaps a GUID] 
     myvalue one of the values in your in-list, string 


     select * from foo 
     inner join MYTEMPTABLE on foo.column = MYTEMPTABLE.myvalue and MYTEMPTABLE.QueryId = ? 

     [cannot recall if JET allows ANDs in INNER JOIN as SQL Server does -- 
     if not, adjust syntax accordingly] 

代替

 select * from foo where foo.column IN (...)  

這樣你可以有相同的表處理多個併發查詢,因爲每個查詢將有一個唯一的標識符。完成後可以刪除列表中的行:

 DELETE FROM MYTEMPTABLE where QueryID = ? 

P.S.有幾種方法可以處理連接的數據類型問題。你可以在MYTEMPTABLE投的字符串值按要求,或者你可以有多個列中MYTEMPTABLE不同的數據類型,插入和連接上的正確列:

 MYTEMPTABLE 
     id 
     queryid 
     mytextvalue 
     myintvalue 
     mymoneyvalue 
     etc