我有一个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一起创建一个具有分组记录的表
用户输入示例:
结果查询的示例:
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个字符等等,这有助于但不能解决问题。
任何帮助将不胜感激。
答案 0 :(得分:1)
一种解决方法是发送多个查询。由于您使用的是union all
,因此您可以在每次单select
个语句时执行,即
在(例如)master数据库中创建表(不要创建临时表!因为它们将在每次查询后被删除) - 但在此之前,请确保创建新表,因此如果存在则删除旧表(同时删除完成之后的表格)。现在每个select
语句都会更改为insert
语句,这会将记录插入到所谓的临时表中。
通过这种方式,您可以避免冗长的查询,只需发送单个insert .. into.. select
语句。
最后,要获得所有结果,您只需要简单的select
查询。获取此数据后,您应该删除该表,因为它不再需要。