我正在学习如何在Excel驱动的SQL查询中使用参数(实际上,我仍在学习SQL),我想更进一步,并在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 = ?)(在此处找到),因为我需要从MODULE_FUNCTION表中提取所有结果,并且仅在提供的组中存在匹配项时才在FUNCTION_SECURITY表的右侧插入结果(如果没有匹配项,则保留null) 。
WHERE (sec.GROUP_ID = ?)
当我尝试AND (sec.GROUP_ID = ?)最后使用时,我在Excel中收到 “无效的参数编号” 。从我的聚集中,“?” 只能与WHERE一起使用(并且可以在测试查询中为我找到)。
AND (sec.GROUP_ID = ?)
我尝试了很多事情,包括声明@parameter,但无济于事。
我知道您说过要避免使用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")
部分。
链接到工作表上的创建按钮并链接到宏:
http://office.microsoft.com/zh-CN/excel-help/add-a-button-and-assign-a-macro- to-it-in-a-worksheet-HP010236676.aspx