VBA 列限制中的 SQL 命令

标签 sql sql-server excel vba

一个可以带多少列是否有限制sqlcommand在 VBA 代码中?我的代码很长,但用于确保我始终从正确的数据库中提取。 m2mdata02将替换为代码 CatalogM2M根据用户在数据库中的选择。要带入的总列数是 7 个表中的 23 列。

Sqlcommand = “select left(m2mdata02.dbo.jomast.fjobno,5) as job, m2mdata02.dbo.jomast.fjobno, m2mdata02.dbo.jomast.fpartno, m2mdata02.dbo.jomast.fstatus, m2mdata02.dbo.jomast.fact_rel, m2mdata02.dbo.jomast.fddue_date, m2mdata02.dbo.jomast.fprodcl, m2mdata02.dbo.jomast.frel_dt, m2mdata02.dbo.jomast.frouting, m2mdata02.dbo.inmastx.fpartno, m2mdata02.dbo.inmastx.fdescript, m2mdata02.dbo.inmastx.fprice, m2mdata02.dbo.somast.fsono, m2mdata02.dbo.somast.fcompany, m2mdata02.dbo.somast.fcustpono, m2mdata02.dbo.aritem.fcinvoice, m2mdata02.dbo.aritem.fprice, m2mdata02.dbo.aritem.fcsono, m2mdata02.dbo.armast.fcinvoice, m2mdata02.dbo.armast.finvdate, m2mdata02.dbo.shmast.fshipdate, m2mdata02.dbo.shmast.fshipno, m2mdata02.dbo.shmast.fcsono
from m2mdata02.dbo.jomast
left join m2mdata02.dbo.inmastx on m2mdata02.dbo.inmastx.fpartno = m2mdata02.dbo.jomast.fpartno
left join m2mdata02.dbo.somast on m2mdata02.dbo.somast.fsono = m2mdata02.dbo.jomast.fsono 
left join m2mdata02.dbo.aritem on m2mdata02.dbo.aritem.FCSONO = m2mdata02.dbo.jomast.fsono
left join m2mdata02.dbo.armast on m2mdata02.dbo.armast.fcinvoice = m2mdata02.dbo.aritem.fcinvoice
left join m2mdata02.dbo.shmast on m2mdata02.dbo.shmast.fcsono = m2mdata02.dbo.somast.fsono
where m2mdata02.dbo.jomast.fprodcl = 'FG11' order by m2mdata02.dbo.jomast.fjobno”

最佳答案

根据MSDN docs ,String的字数限制VBA 中的类型大约是 20 亿 (2^31) 个 Unicode 字符。您的 SQL 查询远不及该限制。如果使用 ADO 将 Excel VBA 连接到数据库,这里的服务器引擎是 SQL Server 决定列限制,23 又是不接近 maximum capacity .
但是,请考虑使用表别名来减少字符,避免重复三个句点标识符,并整体提高可读性甚至可维护性,因为您可以更轻松地为每个用户选择调整表引用。

select left(j.fjobno,5) as job
       , j.fjobno
       , j.fpartno
       , j.fstatus
       , j.fact_rel
       , j.fddue_date
       , j.fprodcl
       , j.frel_dt
       , j.frouting
       , i.fpartno
       , i.fdescript
       , i.fprice
       , so.fsono
       , so.fcompany
       , so.fcustpono
       , ari.fcinvoice
       , ari.fprice
       , ari.fcsono
       , arm..fcinvoice
       , arm..finvdate
       , sh.fshipdate
       , sh.fshipno
       , sh.fcsono 
       
from m2mdata02.dbo.jomast j
left join m2mdata02.dbo.inmastx i on i.fpartno = j.fpartno 
left join m2mdata02.dbo.somast so on so.fsono = j.fsono 
left join m2mdata02.dbo.aritem ari on ari.FCSONO = j.fsono 
left join m2mdata02.dbo.armast arm on arm..fcinvoice = ari.fcinvoice 
left join m2mdata02.dbo.shmast sh on sh.fcsono = so.fsono 
where j.fprodcl = 'FG11' 
order by j.fjobno

顺便说一句,对于非常长的查询,避免在 VBA 中使用行连接和双引号构建字符串,并直接从格式化的 SQL 文本文件中读取:
Dim strSQL As String

' READ SQL QUERY FROM FILE
With CreateObject("Scripting.FileSystemObject")
      strSQL = .OpenTextFile("C:\path\to\my\SQL\Query.sql", 1).readall
End With

' REPLACE DB IN STRING
strSQL = Replace(strSQL, "m2mdata02", "someotherdb")

关于VBA 列限制中的 SQL 命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63443565/

相关文章:

mysql - 如何返回mysql子查询的行数

MySQL - 从两个表中获取两个计数并将它们按另一列分组

sql - ORDER BY 在 CASE 表达式中有两个条件

vba - 如果过滤器中没有值,则退出 sub

Excel:如何在数据透视表中创建自定义年龄范围组?

mysql - 合并重复的电子邮件和点 mysql

mysql - 如何通过具有多个可搜索列的 MySQL DB 进行有效搜索?

sql - 如何在 SQL Server 中左连接到第一行

用于选择前一天的所有行的 SQL 语句

excel - EPPLUS 添加注释结果打开 Excel 文件时出错