VBA中ODBCConnection.CommandText字符串的最大长度是否有变通方法?

时间:2018-03-13 11:10:40

标签: excel vba excel-vba odbc command-text

我有一个VBA脚本,可以在Excel中为SAP HANA ODBC连接生成查询字符串。查询由用户输入确定,并且长度可以变化很大。查询本身使用UNION ALL语法将许多版本的类似查询相互附加。

尝试刷新时,脚本有时会抛出运行时错误。从我的研究中可以清楚地看出,原因是CommandText字符串超过了允许的最大长度32,767(https://ask.sqlservercentral.com/questions/50819/too-long-sql-in-excel-vba.html)。

我想知道是否有一个解决方法,除了使用存储过程(如果有一种方法在运行时创建存储过程然后执行它,我不反对此,但我不能使用预定义的存储过程,因为我的查询总是不同,因此需要VBA来创建它)

有关VBA中动态查询的更多信息:

  • 列名称和参数是动态创建的,每次都可以不同

  • 查询使用产品编号列表组为每个产品组生成IN语句,然后将这些产品的销售额加到该组名称下。然后,这些是UNION一起创建一个具有分组记录的表

用户输入示例:

Example of user input

结果查询的示例:

WITH SOME_CTE (SOME_FIELDS) AS 
(SELECT SOME_STUFF
FROM SOME_TABLE
WHERE SOME_STUFF_IS_GOING_ON)

SELECT GEND "Gender", 'Attribute 1'  "Attribute", SUM(UNITS) "Units", SUM(VAL) "Value", SUM(MARGIN) "Margin"
FROM KPI_SUM
WHERE PRODUCT IN ('12345', '23456', '34567', '45678')
GROUP BY GEND

UNION ALL

SELECT GEND, 'Attribute 2'  ATTR_NAME, SUM(UNITS), SUM(VAL), SUM(MARGIN)
FROM KPI_SUM
WHERE PRODUCT IN ('01234', '02345', '03456', '03567')
GROUP BY GEND
ORDER BY "Gender", "Attribute"

......等等。

正如您所看到的,2个属性组包含4个产品,每个都没有问题,但是当我们达到30个,每个数百个时,它可能会太长。

注意:我已经尝试过将查询字符串的重复部分中的字段引用缩短为1个字符等等,这有助于但不能解决问题。
任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:1)

一种解决方法是发送多个查询。由于您使用的是union all,因此您可以在每次单select个语句时执行,即

在(例如)master数据库中创建表(不要创建临时表!因为它们将在每次查询后被删除) - 但在此之前,请确保创建新表,因此如果存在则删除旧表(同时删除完成之后的表格)。现在每个select语句都会更改为insert语句,这会将记录插入到所谓的临时表中。

通过这种方式,您可以避免冗长的查询,只需发送单个insert .. into.. select语句。

最后,要获得所有结果,您只需要简单的select查询。获取此数据后,您应该删除该表,因为它不再需要。