2011-01-28 49 views
3

我有一个相当复杂的SQL查询与嵌套子查询。当我尝试在Microsoft Query中使用参数时,我说可以在不能用图形表示的查询中使用参数。所以我需要另一种选择。我认为你可以将你的SQL查询放在一个单元格中作为一个字符串,然后让一个宏运行它。任何想法我可以做到这一点?在SQL查询中使用参数与子查询

感谢

-Jesse

回答

1

这里是什么,我来解决Microsoft查询的限制在Excel 2007中:

  1. 一个在微软产生一个虚拟的查询(SELECT NULL AS Test,例如)查询并将其插入到工作表中。
  2. 右键单击MS Query刚刚插入的表格,然后单击表格 - >编辑外部数据属性。
  3. 单击连接属性按钮,然后单击定义选项卡。
  4. 在命令文本部分,使用通常的'?'约定为参数写出或粘贴所需的查询,然后单击确定。
  5. 单击确定退出外部数据属性窗口。
  6. 再次右键单击表格,然后选择Table-> Parameters以常规方式绑定参数。

这个想法是绕过MS Query提供的GUI,它具有底层引擎不具有的任意限制。

这适用于许多复杂的查询,但不是全部。当我遇到MS Query拒绝摘要的查询时,我要么重构查询(如果可行),要么在SQL服务器上创建一个VIEW并针对该查询进行查询。

+0

工作就像一个魅力。感谢您的解决方法 – jomille 2011-02-01 02:49:04

0

不幸的是?对我的大多数查询都不起作用,其中很多不适合转换为视图。

我使用的主要替代越来越宏返回代码

Dim Con As New ADODB.Connection 
Dim RS As New ADODB.Recordset 
Dim server, Database As String 
Dim Data as Worksheet 

Set data = ThisWorkBook.Worksheets("data") 

'rename field here and elsewhere to your variable eg SD or StartDate 
Dim field as string 

server = "servername" 
Database = "database" 

'set connection string 

If Con.State <> 1 Then 
Con.ConnectionString = "Provider=SQLOLEDB;Data Source=" & server & ";Initial Catalog=" & Database & ";Integrated Security=SSPI;" 


'this is just setting the connection time out to infinite 
setcono: 
Con.ConnectionTimeout = 0 
Con.CommandTimeout = 0 


'this is making sure it set the connection time out to infinite 
If Con.ConnectionTimeout > 0 Then GoTo setcono 
If Con.CommandTimeout > 0 Then GoTo setcono 

Con.Open 

Set oRS = New ADODB.Recordset 
oRS.ActiveConnection = Con 

field = Range("A2").value 

oRS.Source = "YOUR SQL QUERY " 
oRS.Source = oRS.Source & " WHERE field = '" & field & "'" 

oRS.Open 
data.Range("A2").CopyFromRecordset oRS 
End If 
oRS.Close 
Con.Close 
If Not oRS Is Nothing Then Set oRS = Nothing 
If Not Con Is Nothing Then Set oCon = Nothing 

我很想微软修复错误,这错误的更复杂的查询返回的错误,因为我觉得它只是令人沮丧的创建宏返回一个简单的数据集

0

另一种方式来解决这个问题的目的是使用,然后在桌子上适当的存储过程

CREATE PROCEDURE [dbo].[yourprocedure] @DATEFROM DATETIME, @DATETO DATETIME 
AS 


SELECT Query 
where date >= @datefrom 
and date <= @dateto 

连接点击连接属性按钮,然后点击定义选项卡。在命令正文部分:

EXEC yourprocedure @DATEFROM = ?, @DATETO = ? 

并直接在?到你想要的细胞