【发布时间】:2021-04-23 08:39:06
【问题描述】:
Excel 文件:
| A | B | C | D | E
---|----------------|-----------------|-----------------------------|-----------------|------------
1 | sales_date | 2020-01-15 | =CONCATENATE(C2,C3) | |
2 | | | SQL-Query Part 1* | |
3 | | | SQL-Query Part 2* | |
4 | | | | |
VBA
Sub Get_Data_from_DWH()
Dim conn As New ADODB.Connection
Dim rs As New ADODB.Recordset
Set conn = New ADODB.Connection
conn.ConnectionString = "DRIVER={MySQL ODBC 5.1 Driver}; SERVER=XX.XXX.XXX.XX; DATABASE=bi; UID=testuser; PWD=test; OPTION=3"
conn.Open
strSQL = Sheet1.Range("C1")
Set rs = New ADODB.Recordset
rs.Open strSQL, conn, adOpenStatic
Sheet1.Range("D1").CopyFromRecordset rs
rs.Close
conn.Close
End Sub
SQL 查询:
SELECT
product, brand, sales_channel,
country, sales_manager, sales_date, return_date,
process_type, sale_quantity, return_quantity, sales_value, variable_costs, fixed_costs
FROM bi.sales
WHERE sales_date = '"&B1&" AND country IN ('DE', 'US', 'NL')
ORDER BY FIELD (brand, 'brand_A', 'brand_B', 'brand_C');
我想用上面的VBA 运行上面的SQL-Query。
问题是查询包含超过 255 个字符,因此它不适合一个 Excel 单元格。
因此,我将查询随机拆分为Cell C2 和Cell C3 中的两部分,并在Cell C1 中使用CONCATENATE(C2,C3) 将查询的两部分组合起来。
当我现在运行VBA 时,我得到runtime error '-2147217887 (80040e21)'。
我猜VBA 无法处理Cell C1 中的CONCATENATE(C2,C3)。
因此,我想知道是否有其他方法可以解决此问题?
注意:
我知道我可以将 SQL 直接放入 VBA 代码中。但是,我的想法是拆分 SLQ 字符串和执行代码,因为我的原始 SQL 的字符比这个问题中的示例还要多,我想保持 VBA 的结构如this question 中所述。 p>
【问题讨论】:
-
(a) Excel 单元格没有 255 个字符的限制。 (b) 我强烈认为您的问题来自无效的 SQL 语句。 (c) 您的子句
"&L1&"看起来很可疑。L1应该是一个参数吗? (d) 我强烈建议使用ADODB-Parameter,例如stackoverflow.com/a/60640185/7599798 -
(a) 有一个限制:stackoverflow.com/questions/12386414/… (b) 如果我使用少于 255 个字符,SQL 语句就会运行,(c) 引用 L1 是上述问题中的错字。我将其固定为 B1,因为它应该引用此单元格 (d) 我将检查 ADODB 参数
-
链接的问题是关于 公式 的长度,而不是单元格的长度。 SQL 语句肯定没有 255 个字符的限制。将日期传递给查询始终是一个问题,如果您不使用 ADODB.Parameter,则需要完全按照数据库的预期格式化 SQL 语句 - 这对于不同的数据库非常不同