我经常使用 MS ExcelGet External Data
来创建简单的报告——针对数据库运行查询并在 Excel 中很好地显示。Excel 的强大功能(如过滤和数据透视表)以及用户熟悉的界面使其非常适合这一点。但是,Microsoft Query 的一个限制是您不能向无法以图形方式显示的查询添加参数,这极大地限制了您可以编写的 SQL。
出现“无法以图形方式显示的查询中不允许参数”的错误有什么解决办法吗?
我经常使用 MS ExcelGet External Data
来创建简单的报告——针对数据库运行查询并在 Excel 中很好地显示。Excel 的强大功能(如过滤和数据透视表)以及用户熟悉的界面使其非常适合这一点。但是,Microsoft Query 的一个限制是您不能向无法以图形方式显示的查询添加参数,这极大地限制了您可以编写的 SQL。
出现“无法以图形方式显示的查询中不允许参数”的错误有什么解决办法吗?
Excel 的 SQL Server 查询界面不会让您拥有自定义参数。解决此问题的一种方法是创建通用 Microsoft Query,然后添加参数,然后将参数化查询粘贴到连接的属性中。以下是 Excel 2010 的详细步骤:
简单的解决方法(无需 VBA)
从这里,通过添加“?”直接编辑 SQL 任何你想要一个参数的地方。工作方式与以前相同,只是您不会被唠叨。
如果您有 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
对于 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
是 - 解决方案是将工作簿保存到 XML 文件中(例如“XML 电子表格 2003”)并在记事本中将此文件编辑为文本!使用记事本的“搜索”功能查找查询文本并将数据更改为“?”。
保存并在excel中打开,尝试刷新数据,excel将监控参数。