Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/29.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在SQL查询和子查询中使用参数_Sql_Excel - Fatal编程技术网

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

在SQL查询和子查询中使用参数,sql,excel,Sql,Excel,我有一个相当复杂的SQL查询和一个嵌套的子查询。当我尝试在Microsoft Query中使用参数时,就是说我可以在无法以图形方式表示的查询中使用参数。所以我需要另一个选择。我认为可以将SQL查询作为字符串放在单元格中,然后让宏运行它。你知道我该怎么做吗 谢谢 -Jesse以下是我如何克服Excel 2007中Microsoft Query的局限性: A在Microsoft query中生成一个虚拟查询(例如,选择NULL作为测试),并将其插入工作表 右键单击MS Query刚刚插入的表,然后单

我有一个相当复杂的SQL查询和一个嵌套的子查询。当我尝试在Microsoft Query中使用参数时,就是说我可以在无法以图形方式表示的查询中使用参数。所以我需要另一个选择。我认为可以将SQL查询作为字符串放在单元格中,然后让宏运行它。你知道我该怎么做吗

谢谢


-Jesse

以下是我如何克服Excel 2007中Microsoft Query的局限性:

  • A在Microsoft query中生成一个虚拟查询(
    例如,选择NULL作为测试
    ),并将其插入工作表
  • 右键单击MS Query刚刚插入的表,然后单击表->编辑外部数据属性
  • 单击“连接属性”按钮,然后单击“定义”选项卡
  • 在命令文本部分,使用参数的常用“
    ”约定写出或粘贴所需的查询,然后单击确定
  • 单击“确定”退出“外部数据属性”窗口
  • 再次右键单击表格,选择表格->参数,以常规方式绑定参数
  • 其思想是绕过MS Query提供的GUI,它有一些底层引擎没有的任意限制


    这适用于许多复杂的查询,但不是所有查询。当我遇到一个MS query根本无法消化的查询时,我要么重构该查询(如果可行),要么在SQL server上创建一个
    视图
    ,并根据该视图进行查询。

    不幸的是?对我的大多数查询都不起作用,而且很多查询不一定适合转换为视图

    我使用的主要替代方法是使用宏返回代码

    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
    
    Dim Con作为新的ADODB连接
    将RS设置为新ADODB.Recordset
    Dim服务器,数据库为字符串
    Dim数据作为工作表
    设置数据=此工作簿。工作表(“数据”)
    '将此处和其他地方的字段重命名为变量,例如SD或StartDate
    作为字符串的Dim字段
    server=“servername”
    Database=“Database”
    '设置连接字符串
    如果符合第1条,则
    Con.ConnectionString=“Provider=SQLOLEDB;Data Source=“&server&”Initial Catalog=“&Database&”integratedsecurity=SSPI;”
    '这只是将连接超时设置为无限
    塞特科诺:
    Con.ConnectionTimeout=0
    Con.CommandTimeout=0
    '这是为了确保将连接超时设置为无限
    如果Con.ConnectionTimeout>0,则转到setcono
    如果Con.CommandTimeout>0,则转到setcono
    未结
    Set oRS=新的ADODB.Recordset
    oRS.ActiveConnection=Con
    字段=范围(“A2”).值
    oRS.Source=“您的SQL查询”
    oRS.Source=oRS.Source&“其中字段=”&字段&“
    开放的
    data.Range(“A2”).从记录集复制
    如果结束
    好的,结束
    结案
    如果不是oRS,则设置oRS=Nothing
    如果Not Con为Nothing,则设置oCon=Nothing
    

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

    另一种解决方法是使用存储过程

    CREATE PROCEDURE [dbo].[yourprocedure] @DATEFROM DATETIME, @DATETO DATETIME
    AS
    
    
    SELECT Query 
    where date >= @datefrom
    and date <= @dateto 
    
    还有指挥?到你想要的细胞

    EXEC yourprocedure @DATEFROM = ?, @DATETO = ?