如何解决Excel崩溃某些SELECT语句?

6 sql oracle vba ado excel-vba

这两个语句类似,但第二个语句导致Excel每次执行时崩溃.唯一的区别是model和之间model return updated rows(我特意设计了这个最小的例子,以便在任何一种情况下查询都返回完全相同的数据,我的真实世界的SQL当然是不同的):

  1. select *
    from( select *
          from ( select 1 id, 100 val from dual
                 union all 
                 select 2 id, 200 val from dual )
          model
          dimension by (id)
          measures (val)
          rules ( val[1] = val[cv()]+1 ) )
    where val=101
    
    Run Code Online (Sandbox Code Playgroud)
  2. select *
    from( select *
          from ( select 1 id, 100 val from dual
                 union all 
                 select 2 id, 200 val from dual )
          model return updated rows
          dimension by (id)
          measures (val)
          rules ( val[1] = val[cv()]+1 ) )
    where val=101
    
    Run Code Online (Sandbox Code Playgroud)

这是ADO中的一个错误的孤立示例,还是有一个已知的SQL语句类崩溃了解析器(我甚至不确定为什么ADO会解析语句而不是只是将它传递给数据库).

以下是崩溃版本的完整VBA代码:

Option Explicit
Sub Go()

    Dim lConn As ADODB.Connection
    Dim lRecordset As ADODB.Recordset
    'Dim lRecordset
    Dim sSQL As String

    Set lConn = New ADODB.Connection
    Set lRecordset = New ADODB.Recordset
    'Set lRecordset = CreateObject("ADODB.Recordset")

    lConn.Open "Provider=MSDAORA;Data Source=(DESCRIPTION=(CID=GTU_APP)(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=devdb)(PORT=1521)))(CONNECT_DATA=(SID=oracle)(SERVER=DEDICATED)));User Id=csuk;Password=thisisnotmyrealpassword;"

    With lRecordset
        sSQL = "select * " & _
               "from( select * " & _
               "      from ( select 1 id, 100 val from dual " & _
               "             Union all " & _
               "             select 2 id, 200 val from dual ) " & _
               "      model return updated rows " & _
               "      dimension by(id) " & _
               "      measures (val) " & _
               "      rules ( val[1] = val[cv()]+1 ) ) " & _
               "where val=101"
        .Open sSQL, lConn
        While Not .EOF
            Sheets(1).Cells(1, 1) = ![Val]
            .MoveNext
        Wend
        .Close
    End With

    Set lRecordset = Nothing
    lConn.Close
    Set lConn = Nothing

End Sub
Run Code Online (Sandbox Code Playgroud)

在回复评论时,我尝试使用DAO使用相同的SQL,并且对于我的困惑,我们得到了相同的结果.以下代码崩溃Excel,但删除return updated rows它是使它按预期工作所需的全部内容:

Option Explicit
Sub Go()

    Dim lWorkspace As DAO.Workspace
    Dim lDatabase As DAO.Database
    Dim lRecordset As DAO.Recordset

    Dim sSQL As String

    sSQL = "select * " & _
           "from( select * " & _
           "      from ( select 1 id, 100 val from dual " & _
           "             Union all " & _
           "             select 2 id, 200 val from dual ) " & _
           "      model return updated rows " & _
           "      dimension by(id) " & _
           "      measures (val) " & _
           "      rules ( val[1] = val[cv()]+1 ) ) " & _
           "where val=101"

    Set lWorkspace = DBEngine.Workspaces(0)
    Set lDatabase = lWorkspace.OpenDatabase("", False, False, "Driver={Microsoft ODBC for Oracle};Server=devdb:1521/oracle;Uid=charts_csuk_uksoft;Pwd=thisisnotmyrealpassword;")
    Set lRecordset = lDatabase.OpenRecordset(sSQL, dbOpenDynaset, dbSQLPassThrough)

    With lRecordset
        While Not .EOF
            Sheets(1).Cells(1, 1) = ![Val]
            .MoveNext
        Wend
    End With

    Set lRecordset = Nothing
    Set lDatabase = Nothing
    Set lWorkspace = Nothing

End Sub
Run Code Online (Sandbox Code Playgroud)

Dav*_*shi 2

这更像是一种解决方法,而不是解决方案,但它可能是隐藏任何 SQL 语句的选项,从而扰乱 ADO(或 Excel,就此而言)VIEW。对于动态语句(即在运行时更改视图),您可以考虑在EXECUTE IMMEDIATE CREATE OR REPLACE VIEW ...其中使用过程。