在excel vba上划分sql查询

Posted

技术标签:

【中文标题】在excel vba上划分sql查询【英文标题】:Divide sql query on excel vba 【发布时间】: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

【问题讨论】:

【参考方案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】:

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

【讨论】:

以上是关于在excel vba上划分sql查询的主要内容,如果未能解决你的问题,请参考以下文章

从 Excel VBA 运行嵌套的 Access SQL 查询

excel 2010 vba。 sql查询列'like' vlookup

使用 VBA-Excel 跨多个数据库进行 SQL 查询

在 Excel VBA 中使用长 Access SQL 查询

具有更多条件的日期之间的 SQL 查询(VBA Excel - Access)

使用 Excel VBA 查询 MS Access,SQL BETWEEN 日期查询