【发布时间】:2011-07-28 15:23:02
【问题描述】:
我目前正在编写一个基于 VBA 的 Excel 加载项,该加载项很大程度上基于 Jet 数据库后端(我使用的是 Office 2003 套件——无论如何,问题与更新版本的 Office 相同)。
在我的应用程序初始化期间,我创建了在文本文件中定义的存储过程。我的应用会在需要时调用这些过程。
让我举一个简单的例子来描述我的问题:假设我的应用程序允许最终用户选择他们想要详细信息的订单的标识符。这是表定义:
表 tblOrders:OrderID LONG、OrderDate DATE、(其他字段)
最终用户可以选择一个或多个 OrderID,显示在一个表单中 - 她/他只需勾选她/他想要详细信息(OrderDate 等)的相关 OrderID 的复选框。
因为我事先不知道他/她会选择多少个 OrderID,所以我可以根据表单上的选择,通过级联 WHERE 子句,在 VBA 代码中动态创建 SQL 查询:
SELECT * FROM tblOrders WHERE OrderID = 1 OR OrderID = 2 OR OrderID = 3
或者,更简单的是,使用 IN 关键字:
SELECT * FROM tblOrders WHERE OrderID IN (1,2,3)
现在,如果我将这个简单的查询转换为存储过程,以便动态传递我想要显示的 OrderID 列表,我应该怎么做?我已经尝试过:
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 代码(即动态地将值列表分配给在我的应用程序中硬编码的查询)来处理这个问题。如果这是不可能的,我会理解的。
有什么线索吗?
【问题讨论】:
-
只是一个额外的精度:我已经查看了诸如“将 ID 数组传递给存储过程”之类的线程以及此处给出的解释:“sommarskog.se/arrays-in-sql.html”,但这些仅适用于 SQL Server。
标签: vba stored-procedures parameter-passing jet