我正在学习如何在excel驱动的SQL查询中使用参数(实际上我仍在学习SQL)。感谢helped me build my query to modify the results as I need的好人,我想更进一步,在Excel中提供一个参数来过滤结果。
这是我的问题:
SELECT
fun.FUNCTION_ID
,COALESCE(fun.parent_function, fun2.function_id) as PARENT_FUNCTION
,fun.MODULE_ID
,fun.DESCRIPTION
,fun.FUNCTION_PURPOSE
,fun.PB_OBJECT
,sec.GROUP_ID
,sec.ACCESS_LEVEL
from
MODULE_FUNCTION fun
LEFT JOIN MODULE_FUNCTION fun2
ON fun.function_id = fun2.function_id
AND fun2.function_id IN (SELECT parent_function FROM MODULE_FUNCTION)
LEFT OUTER JOIN FUNCTION_SECURITY sec
ON fun.FUNCTION_ID = sec.FUNCTION_ID
AND sec.GROUP_ID = 'GROUP_NAME'
我需要做的是允许团队成员在Excel工作表中运行此查询,并在第二个JOIN中提供“GROUP_NAME”的组名。不幸的是我无法使用语法WHERE (sec.GROUP_ID = ?)
(found here),因为我需要从MODULE_FUNCTION表中提取所有结果,并且只在所提供的组匹配时在FUNCTION_SECURITY表的右侧插入结果(没有匹配时留空。)
当我尝试在最后使用AND (sec.GROUP_ID = ?)
时,我在Excel中获得“无效参数编号”。从我收集到的,“?”只能与WHERE一起使用(并且可以在测试查询中找到我的工作)。
我尝试了很多东西,包括声明@parameter,但没有用。
我很想尝试this technique,但如果可能的话,我想避免使用VB。
答案 0 :(得分:4)
我知道你说你想避免使用VB,但对于你想做的事情来说并不是太复杂。
您可以让工作表具有组名称的单元格,然后是一个调用宏的按钮,您可以在其中更改sql查询以调整group_id。
类似的东西:
Dim sql As String
sql = "select ... from ... and sec.GROUP_ID = '?'"
sql = Replace(sql, "?", Worksheets("Analysis").Range("A1").Value)
With ActiveWorkbook.Connections("connection name").OLEDBConnection
.CommandText = sql
.Refresh
End With
其中:
Worksheets("Analysis").Range("A1").Value
是Group_ID。您可以将其设置为工作簿中任何工作表中的特定单元格。我会在它旁边创建一个名为“刷新表”的按钮或类似的东西。
如果您已经创建了一个链接到数据库的表,那么Excel中就有一个连接对象。转到“数据”选项卡,然后单击“连接”。将弹出一个新窗口。找到与SQL查询匹配的连接。单击该连接并单击“属性”,然后将连接名称更改为简单的名称(通常是基于您连接的服务器/表的某个长名称)。用于
ActiveWorkbook.Connections("connection name")
部分。
链接到工作表上的创建按钮并链接到宏: