MS Query 中的问题设置参数

Posted

技术标签:

【中文标题】MS Query 中的问题设置参数【英文标题】:Issue setting parameters in MS Query 【发布时间】:2014-12-11 02:29:15 【问题描述】:

我有一个连接到 Excel 仪表板的 Access 数据库。我有一个执行任务的查询,但需要将几个日期设置为条件才能完成查询。我使用参数指向仪表板中的几个点,以检索查询正确执行所需的日期。

访问字段中的日期设置为date/time,仪表板中的日期也设置为date/time。出于某种原因,当我尝试运行查询时,它显示[Microsoft][ODBC Microsoft Access Driver] Data type mismatch in criteria expression]。正如我之前提到的,它指向的 Excel 位置和它连接到的 Access 字段都设置为相同的类型。

如果我将日期硬编码到 SQL 中,查询会完美运行,在参数弹出窗口中键入它们时也会正确运行。这不起作用的唯一一次是当我尝试将其指向仪表板中的日期时,导致上面的错误消息。这是我的查询代码:

SELECT tbl_Master_Phone.ID, 
  tbl_Master_Bill_Cycle_Date.Bill_Cycle_Date, 
  tbl_Master_ECPD.Client_ID, 
  tbl_Master_Client.Client_Name, 
  tbl_Master_ECPD.ECPD_ID, 
  tbl_Master_Account.Account_Number, 
  tbl_Master_Phone.Wireless_Number, 
  tbl_Master_Username.User_Name, 
  tbl_Master_Cost_Center.Cost_Center, 
  Max(tbl_Inventory.Bill_Cycle_Date) , 
  tbl_Master_Device.Device_Model, 
  tbl_Master_Device.Device_Type, 
  tbl_Inventory.Device_ID, 
  tbl_Inventory.SIM, 
  tbl_Inventory.Contract_Activate_Date, 
  tbl_Inventory.Contract_End_Date, 
  tbl_Inventory.Upgrade_Eligibility_Date
    FROM tbl_Master_Username 
      INNER JOIN ((tbl_Master_Client 
      INNER JOIN ((tbl_Master_Account 
      INNER JOIN tbl_Master_ECPD 
        ON tbl_Master_Account.ECPD_ID = tbl_Master_ECPD.ID) 
      INNER JOIN (tbl_Master_Device 
      INNER JOIN (tbl_Master_Phone 
      INNER JOIN tbl_Inventory 
        ON tbl_Master_Phone.ID = tbl_Inventory.Wireless_Number) 
        ON tbl_Master_Device.ID = tbl_Inventory.Device_Model) 
        ON tbl_Master_Account.ID = tbl_Inventory.Account_Number) 
        ON tbl_Master_Client.ID = tbl_Master_ECPD.Client_ID) 
      INNER JOIN (tbl_Master_Bill_Cycle_Date 
      INNER JOIN (tbl_Master_Cost_Center 
      INNER JOIN tbl_Phone_Details 
        ON tbl_Master_Cost_Center.ID = tbl_Phone_Details.Cost_Center)
        ON tbl_Master_Bill_Cycle_Date.Bill_Cycle_Date = tbl_Phone_Details.Bill_Cycle_Date) 
        ON tbl_Master_Phone.ID = tbl_Phone_Details.Wireless_Number) 
        ON tbl_Master_Username.ID =  tbl_Phone_Details.Username
Where ((tbl_Inventory.Bill_Cycle_Date<=?))
GROUP BY tbl_Master_Phone.ID, 
         tbl_Master_Bill_Cycle_Date.Bill_Cycle_Date, 
         tbl_Master_ECPD.Client_ID, 
         tbl_Master_Client.Client_Name, 
         tbl_Master_ECPD.ECPD_ID, 
         tbl_Master_Account.Account_Number, 
         tbl_Master_Phone.Wireless_Number, 
         tbl_Master_Username.User_Name, 
         tbl_Master_Cost_Center.Cost_Center, 
         tbl_Master_Device.Device_Model, 
         tbl_Master_Device.Device_Type, 
         tbl_Inventory.Device_ID, 
         tbl_Inventory.SIM, 
         tbl_Inventory.Contract_Activate_Date, 
         tbl_Inventory.Contract_End_Date, 
         tbl_Inventory.Upgrade_Eligibility_Date
HAVING ((tbl_Master_Bill_Cycle_Date.Bill_Cycle_Date>=?)
      AND (tbl_Master_ECPD.Client_ID=?) 
      AND (tbl_Master_Bill_Cycle_Date.Bill_Cycle_Date<=?));

如您所见,在WHERE 语句之后设置了参数,在HAVING 之后又设置了三个参数。 HAVING 之后的第二个参数工作正常,但是需要日期的三个参数是抛出错误的参数。如果数据类型相同,可能导致此问题的原因是什么?

【问题讨论】:

Excel 的日期可能很奇怪,而 MS Access 需要明确的日期,也许您可​​以发布提供参数的 Excel 代码? PS 看看别名,它们使 SQL 更具可读性。 不幸的是,这是 MS Query 在设计视图中设置后构建的 SQL。至于 Excel 代码,我不完全确定您的意思。您是否想要单元格位置以及参数指向的位置? Nope :) 我与你正在做的事情失去了联系。我更喜欢自己写东西,所以我知道发生了什么。 Microsoft 提供了无数的快捷方式,但我很少发现它们足够有用。 【参考方案1】:

看起来问题可以通过将 excel 文件中的日期更改为文本字段而不是日期来解决。这解决了问题。

【讨论】:

将日期作为文本不是一个好主意。检查 MS Access 中的字段类型。文本日期可能导致 1 月 12 日为 12 月 1 日。 我认为这不是最好的方法,但这是我发现的唯一可行的方法。 Access 中的字段类型都设置正确,Excel 中的字段类型也设置正确(直到我更改它们)。我愿意接受更好的解决方案,但与此同时,我会走这条路,直到找到更好的方法。

以上是关于MS Query 中的问题设置参数的主要内容,如果未能解决你的问题,请参考以下文章

具有各种多值参数的 MS Query,其中可以有一个空参数

MS Access Query 中的语法错误 [重复]

使用 pass through query 从 ms access 访问 oracle 数据库表

MySQL-mysql怎样得到一条SQL语句精确到ms级的执行时间

在 MS Query 中使用多个 INNER JOIN 的 FROM 子句中的子查询的语法

MS Query 14 将 Excel 工作表中的数据用作查询的一部分