在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
所说的补充:
在那之后,人们不得不求助于你所做的事情
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
在 Excel VBA 中使用长 Access SQL 查询