Excel 参数来自 SQL 来自 ODBC 的查询“错误 - 使用问号时没有为一个或多个必需参数提供值 `WHERE XXX = ?`

Excel parameters from SQL Query from ODBC "Error - No Value given for one or more required parameters when using question mark `WHERE XXX = ?`

我有一个 Excel 文件与 MS SQL 服务器的 SQLOLEDB 连接,

当我使用 Oracle link 执行此操作时,我可以简单地将 WHERE XXX = ? 放入我的查询中以提示输入 Excel 中的值,但是使用 MSSQL我收到以下错误:

No Value given for one or more required parameters

尝试将基本 excel 查询的值参数化为 ?

如果我使用这样的值,我会得到结果:

SELECT * 
FROM srv.stats
WHERE srv.stats.[year] = '2016'
AND srv.stats.[quarter] = '1'

当我添加参数?时,出现上述错误。

SELECT * 
FROM srv.stats
WHERE srv.stats.[year] = ?
AND srv.stats.[quarter] = ?

我希望能够在不使用 VB 的情况下执行此操作。

无法像在 Access 中那样直接在 SQL 服务器中提示输入。您可以像这样创建传递到查询中的值。

DECLARE @year SMALLINT
SET @year = 2016

DECLARE @quarter TINYINT
SET @quarter = 1

SELECT * 
FROM srv.stats
WHERE srv.stats.[year] = @year
  AND srv.stats.[quarter] = @quarter;

然后您只需要找到适合您的解决方案(Excel?)的方式来通过这些。例如,这可能采用存储过程的形式。

CREATE PROCEDURE testProcedure @year SMALLINT, @quarter TINYINT
AS
    SELECT * 
    FROM srv.stats
    WHERE srv.stats.[year] = @year
      AND srv.stats.[quarter] = @quarter
GO;

由于来自 ODBC 连接的 MS SQL 源本质上不允许您在 SQL 查询中使用 WHERE xxx = ? 代码(与 Oracle 连接不同),因此您需要欺骗 Excel 通过构建 Microsoft Query 然后覆盖它来允许来自 MS SQL 数据源的参数。

打开一个新的 Excel 文件并转到 Data 选项卡,选择 From Other Sources 下拉菜单和 select From Microsoft Query.

Choose Data Source window 会出现。选择现有数据源或通过 selecting <New Data Source> 设置与服务器的新连接,然后单击“确定”。

完成后,您将看到查询向导 window 打开 select table 和列,因为您将添加自己的 SQL 查询稍后只需 select 一个 table 在您的查询中,然后使用 > 按钮将其添加到 Columns in your query: 部分。对于接下来的 2 windows,只需单击 Next,然后最后单击 Finish

然后系统会提示您select您希望如何查看Import Datawindow中的数据,首先单击Properties...按钮。

然后是 Definition 选项卡,在 Command text: 框中您将有一个 SELECT 语句,在下面您需要为金额添加 WHERE 子句您在实际查询中有。这些需要以以下格式添加:

WHERE 1 = ?
AND 2 = ?
AND 3 = ?

完成后单击确定返回导入数据 window 和 select 您的输出类型; Table、数据透视表Table 报表或数据透视图和数据透视表Table 报表,具体取决于您希望如何显示数据。

然后系统将提示您为每个参数输入一个值。如果您从单元格中获取这些值,请按照您将放入实际参数的顺序选择它们的位置。输入参数源后,返回“数据”选项卡并单击“连接”,然后进入“定义”选项卡。

现在在 Command text: 框中粘贴您实际的 SQL 查询,并在 WHERE 子句 = ? 中使用您的参数,并按照您定义的来源和单击“确定”,您的数据现在应该像通常使用的参数一样填充。