在SQL查询中使用参数进行子查询

我有一个相当复杂的SQL查询嵌套子查询。 当我尝试在Microsoft Query中使用参数时,我说我可以在不能用graphics表示的查询中使用参数。 所以我需要另一个select。 我认为你可以把你的SQL查询放在一个单元格中,然后用一个macros来运行它。 任何想法我可以做到这一点?

谢谢

-Jesse

以下是我在Excel 2007中解决Microsoft Query的局限性:

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

这个想法是绕过了MS查询提供的graphics用户界面,有一些任意的限制,底层的引擎没有。

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

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

我使用的主要select是得到一个macros来返回代码

 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 

我会爱微软修复错误,为更复杂的查询返回错误,因为我发现它只是为了返回一个简单的数据集

解决这个问题的另一种方法是使用存储过程

 CREATE PROCEDURE [dbo].[yourprocedure] @DATEFROM DATETIME, @DATETO DATETIME AS SELECT Query where date >= @datefrom and date <= @dateto 

然后在表格属性上单击连接属性button,然后单击定义选项卡。 在命令文本部分:

 EXEC yourprocedure @DATEFROM = ?, @DATETO = ? 

并指示? 到你想要的细胞