使用SQL查询中的参数和子查询

时间:2011-01-28 18:22:03

标签: sql excel

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

由于

-Jesse

3 个答案:

答案 0 :(得分:1)

以下是我在Excel 2007中解决Microsoft Query限制的问题:

  1. 在Microsoft Query中生成一个虚拟查询(例如SELECT NULL AS Test)并将其插入到工作表中。
  2. 右键单击MS Query刚刚插入的表,然后单击表 - >编辑外部数据属性。
  3. 单击“连接属性”按钮,然后单击“定义”选项卡。
  4. 在“命令文本”部分中,使用通常的“?”参数约定写出或粘贴所需的查询,然后单击“确定”。
  5. 单击“确定”退出“外部数据属性”窗口。
  6. 再次右键单击该表,然后选择Table-> Parameters以通常的方式绑定参数。
  7. 这个想法绕过了MS Query提供的GUI,它有一些基本引擎没有的任意限制。

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

答案 1 :(得分: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

我希望微软能够修复它为更复杂的查询返回错误的错误,因为我发现只是为了返回一个简单的数据集而令人沮丧的创建宏

答案 2 :(得分:0)

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

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


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

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

EXEC yourprocedure @DATEFROM = ?, @DATETO = ?

直接?到你想要的细胞