【问题标题】:Divide sql query on excel vba在excel vba上划分sql查询
【发布时间】:2016-08-31 11:07:00
【问题描述】:

我想在这里分割一个长查询是它的一部分,当我删除第二行时(用 !! 表示)一切正常,但是当我添加时,收到错误“类型不匹配”。原因是行的长度,如果我缩短第二行并添加没有问题。

我用这种方法来划分查询但收到错误原因导致行长知道吗?

strSqla = "SELECT DT4 .ABH, DT4 .S1 , CASE WHEN S1 = 'AV' OR S1 = 'AN' OR S1 = 'AY' THEN 'PDE' "
' !!!!!!strSqla = strSqla & "WHEN S1 = 'AE' OR S1 = 'AH' OR S1 = 'AK' OR S1 = 'FE' THEN 'EME' "
strSqla = strSqla & "ELSE 'MANUAL' END AS division "
strSqla = strSqla & "FROM H9.PCFILES.DT4 DT4 WHERE DT4 .IDATE > '" & X & "'"
With ActiveSheet.ListObjects.Add(SourceType:=0, Source:="ODBC;DSN=PCFILES289;", Destination:=Range("$A$1")).QueryTable
   .CommandText = Array(strSqla)
    .RowNumbers = False

【问题讨论】:

    标签: sql excel vba


    【解决方案1】:

    使用行连续符和字符串连接:

    strSqla = "SELECT DT4 .ABH, DT4 .S1 , CASE WHEN S1 = 'AV' OR " & _
              "S1 = 'AN' OR S1 = 'AY' THEN 'PDE' WHEN S1 = 'AE' OR " & _
              "S1 = 'AH' OR S1 = 'AK' OR S1 = 'FE' THEN 'EME' " & _
              "ELSE 'MANUAL' END AS division FROM H9.PCFILES.DT4 " & _
              "DT4 WHERE DT4 .IDATE > '" & X & "'"
    

    【讨论】:

    • 我尝试将两者结合,但仍然收到错误strSqla = "SELECT DT4.ABALPH, DT4.S1, CASE WHEN S1= 'AV' OR S1= 'AN' OR S1= 'AY' THEN 'XDE' " & _ "WHEN S1= 'AE' OR S1= 'AH' OR S1= 'AK' OR S1= 'XE' THEN 'XME' " strSqla = strSqla & "ELSE 'MANUAL' END AS div " strSqla = strSqla & "FROM H9.PCFILE.DT4 DT4 WHERE DT4.IDATE > '" & X & "'"
    • 这对我有什么意义吗?
    【解决方案2】:

    作为Macro Man 所说的补充:

    • 续行有一个限制,大约为 20 行
    • 在那之后,人们不得不求助于你所做的事情

      strSqla = " .... " strSqla = strSqla & " .... "

    • 无论哪种方式,查询构造都会变得相当笨拙,尤其是如果您有单引号 'string-expressions'

    因此,如果您经常使用较长的 SQL 并偶尔更改它们,请考虑以下替代方案之一:

    A) 将 SQL 存储在单独的文本文件中,然后将它们读入带有存储函数的字符串,如下所示:

    Function fetchSQL(path As String) As String
        Dim Line As String
        Dim iFile As Integer
        iFile = FreeFile
        Open path For Input As #iFile
    
        Do Until EOF(iFile)
            Line Input #iFile, Line
            fetchSQL = fetchSQL & vbNewLine & Line
        Loop
    
        Close #iFile
    End Function
    

    并像这样在您的代码中使用它:

    strSqla = fetchSQL("c:\yourpath\p01.sql")
    

    B) 或者,如果您更喜欢将 SQL 存储在工作簿中(假设您使用 excel),您可以将 SQL 存储在工作表列中,并使用如下内容:

    Function fetchSQL as String()
        Dim i as Integer
        i = 1
        While Not IsEmpty(yoursheet.Cells(i, 2))
            fetchSQL = strSQL & vbCrLf & " " & yoursheet.Cells(i, 2).Value
            i = i + 1
        Wend
    End Function
    

    【讨论】:

    • Martin 感谢您的回复,我尝试了第二个选项,从单元格获取 SQL 查询,但仍然出现“类型不匹配”错误。我试过;将所有代码写入一个单元格,拆分写入一个单元格,将代码拆分为2个单元格。它们都不起作用:( fetchSQL = 这一行给出错误,没有进入第二行。
    • 你为什么用.CommandText = Array(fetchSQL)而不是.CommandText = fetchSQL? ` 尝试使用Debug.Print (fetchSQL) 进行测试,以检查您的 SQL 字符串在使用前是否符合您的预期。
    • 谢谢马丁!现在,您的更正选项 1 正在工作。但我仍然对选项 2 从单元格获取查询有错误。 link 将查询划分为单元格,写入单个单元格,添加“”或延续,它们都不起作用link
    • elit,很抱歉 - 我错过了您的回复。 Excel 中的 AFAIK SQL 不支持 CASE 表达式。请改用SWITCH function,看看它是否有效。此外,对于第一次测试,尝试一个稍微不那么复杂的查询,您可以在其中排除任何语法错误,例如select top 10 * from yourtable
    【解决方案3】:

    成功了,为了从单元格中获取 sql 查询,这是正确的代码;

    Function fetchSQL() As String
    Dim i As Integer
    i = 1
    While Not IsEmpty(Sheets("sheet2").Cells(i, 7))
    fetchSQL = fetchSQL & Sheets("Sheet2").Cells(i, 7).Value & " "
    i = i + 1
    Wend
    End Function
    

    【讨论】:

    • 很高兴我能帮上忙。确保 A)通过编辑您的原始帖子或作为 cmets 发布您的问题,并且 B)如果帖子解决了您的问题,则将其标记为答案
    【解决方案4】:

    尝试了第二个选项,但仍然出现错误类型不匹配 这里是图片

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-07
      • 2011-09-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多