39

我经常使用 MS ExcelGet External Data来创建简单的报告——针对数据库运行查询并在 Excel 中很好地显示。Excel 的强大功能(如过滤和数据透视表)以及用户熟悉的界面使其非常适合这一点。但是,Microsoft Query 的一个限制是您不能向无法以图形方式显示的查询添加参数,这极大地限制了您可以编写的 SQL。

出现“无法以图形方式显示的查询中不允许参数”的错误有什么解决办法吗?

4

5 回答 5

55

Excel 的 SQL Server 查询界面不会让您拥有自定义参数。解决此问题的一种方法是创建通用 Microsoft Query,然后添加参数,然后将参数化查询粘贴到连接的属性中。以下是 Excel 2010 的详细步骤:

  1. 打开 Excel
  2. 转到数据选项卡
  3. 从“来自其他来源”按钮中选择“来自 Microsoft Query”
  4. 将出现“选择数据源”窗口。  选择一个数据源并单击OK
  5. 查询 Qizard
    1. 选择列:将出现窗口。目标是创建一个通用查询。我建议从一张小表中选择一列。
    2. 过滤数据:点击下一步
    3. 排序顺序:点击下一步
    4. 完成:只需单击完成
  6. 将出现“导入数据”窗口:
    1. 单击属性...按钮。
      1. 选择定义选项卡
      2. 在“命令文本:”部分添加一个 包含 Excel 参数的 WHERE 子句。现在添加您想要的所有参数很重要。例如,如果我想要两个参数,我可以添加:
        WHERE 1 = ? 和 2 = ?
      3. 单击确定返回“导入数据”窗口
    2. 选择数据透视表
    3. 点击确定
  7. 系统将提示您输入每个参数的参数值。
  8. 输入参数后,您将在数据透视表中
  9. 转到数据选项卡并单击连接属性按钮
    1. 单击定义选项卡
    2. 在“命令文本:”部分中,使用您之前定义的相同数量的参数粘贴到您想要的真实 SQL 查询中。
    3. 单击参数...按钮 
      1. 输入每个参数的提示值
      2. 点击确定
    4. 单击确定关闭属性窗口
  10. 恭喜,你现在有了参数。
于 2012-08-21T13:30:52.960 回答
25

简单的解决方法(无需 VBA)

  1. 右键单击表格,展开“表格”上下文菜单,选择“外部数据属性”
  2. 单击按钮“连接属性”(仅在工具提示中标记)
  3. 转到选项卡“定义”

从这里,通过添加“?”直接编辑 SQL 任何你想要一个参数的地方。工作方式与以前相同,只是您不会被唠叨。

于 2012-07-04T18:29:25.983 回答
7

如果您有 Excel 2007,您可以编写 VBA 来更改工作簿中的连接(即外部数据查询)并更新 CommandText 属性。如果您只是?在需要参数的位置添加,那么下次刷新数据时,它会提示输入连接的值!魔法。当您查看 Connection 的属性时,Parameters 按钮现在将是活动的并且可以正常使用。

例如,我会编写一个宏,在调试器中单步执行它,并使其适当地设置 CommandText。完成此操作后,您可以删除宏 - 这只是更新查询的一种方式。

Sub UpdateQuery
    Dim cn As WorkbookConnection
    Dim odbcCn As ODBCConnection, oledbCn As OLEDBConnection
    For Each cn In ThisWorkbook.Connections
        If cn.Type = xlConnectionTypeODBC Then
            Set odbcCn = cn.ODBCConnection

            ' If you do have multiple connections you would want to modify  
            ' the line below each time you run through the loop.
            odbcCn.CommandText = "select blah from someTable where blah like ?"

        ElseIf cn.Type = xlConnectionTypeOLEDB Then
            Set oledbCn = cn.OLEDBConnection
            oledbCn.CommandText = "select blah from someTable where blah like ?" 
        End If
    Next
End Sub
于 2010-06-22T09:44:49.390 回答
0

对于 Excel 2013 按钮“参数”,即使查询文本包含“?”之类的参数,连接对话框中的按钮也会保持禁用状态。

将参数插入到查询文本中,如下所示:

declare @sd datetime, @ed datetime
set @sd = '2022-01-01' 
set @ed = '2022-01-31' 

select * 
from dbo.Table1 
where date between @sd and @ed

在 VBA 中添加:

Public SQLParams As New Dictionary 'Requred Reference "Microsoft Scripting Runtime"

Sub Button1_Click()
  SQLParams("sd") = "'2022-02-01'"
  SQLParams("ed") = "'2022-02-28'"
      
  UpdateQuery SQLParams
End Sub

'Update params in all Query
Sub UpdateQuery(ByRef SQLParams As Dictionary)
  Dim cn As WorkbookConnection
  Dim odbcCn As ODBCConnection, oledbCn As OLEDBConnection
    
  For Each cn In ThisWorkbook.Connections
    If cn.Type = xlConnectionTypeODBC Then
      Set odbcCn = cn.ODBCConnection
      odbcCn.CommandText = SetParamValues(odbcCn.CommandText, SQLParams)
      odbcCn.Refresh
    ElseIf cn.Type = xlConnectionTypeOLEDB Then
      Set oledbCn = cn.OLEDBConnection
      oledbCn.CommandText = SetParamValues(oledbCn.CommandText, SQLParams)
      oledbCn.Refresh
    End If
  Next
End Sub

Function SetParamValues(SQL As String, ByRef Params As Dictionary) As String
  Dim re As New RegExp, Matches 'Requred Reference "Microsoft VBScript Regular Expressions 5.5"
  
  Dim paramName As Variant, paramValue As String
     
  SetParamValues = SQL
  
  re.IgnoreCase = True
  re.MultiLine = True
  
  For Each paramName In Params.Keys()
    re.Pattern = "(set\s+\@" + paramName + "\s*=\s*)(\'[^\']*\')"
    
    paramValue = Params(paramName)
     
    SetParamValues = re.Replace(SetParamValues, "$1" + paramValue)
  Next 'For Each paramName In Params.Keys()
End Function
于 2022-02-02T10:14:48.310 回答
-1

是 - 解决方案是将工作簿保存到 XML 文件中(例如“XML 电子表格 2003”)并在记事本中将此文件编辑为文本!使用记事本的“搜索”功能查找查询文本并将数据更改为“?”。

保存并在excel中打开,尝试刷新数据,excel将监控参数。

于 2011-07-26T12:01:06.743 回答