在 VBA 中使用 ADODB SQL,为什么仅当我使用分组时字符串才被截断 [至 255]?
Using ADODB SQL in VBA, why are Strings truncated [to 255] only when I use grouping?
我正在使用 ADODB 在 Sheet1 上查询。如果我在 sheet 上使用 SQL 查询获取数据,如下所示,而没有分组,我将从评论中获取所有字符。
但是,如果我使用分组,我的字符将被截断为 255。
注意 – 我的第一行包含 800 个字符,因此驱动程序已正确识别数据类型。
这是我没有分组的查询输出
Select Product, Value, Comment, len(comment) from [sheet1$A1:T10000]
有分组
Select Product, sum(value), Comment, len(comment) from [sheet1$A1:T10000] group by Product, Comment
感谢您 post 这样做!在我使用 ADO 记录集进行 20 多年的数据库开发期间,直到本周我才遇到过这个问题。一旦我追踪到记录集的截断,我真的很抓耳挠腮。在我找到您的 post 并且您让我专注于 GROUP BY 之前,无法想象 how/why 它正在发生。果然,这就是原因(我猜是某种 ADO 错误)。我能够通过将相关的标量子查询放在 SELECT 列表中来解决它,反之使用 JOIN 和 GROUP BY。
详细说明...
10 次中至少有 9 次(根据我的经验)JOIN/GROUP BY 语法可以替换为相关的标量子查询语法,而没有明显的性能损失。在这种情况下这是幸运的,因为 ADO 记录集对象显然存在错误,当字符串长度大于 255 个字符时,GROUP BY 语法会导致文本被截断。
下面的第一个示例使用 JOIN/GROUP BY。第二个使用相关的标量子查询。 would/should 都提供了相同的结果。但是,如果任何评论超过 255 个字符,如果涉及 ADODB 记录集,这两个查询将不会 return 相同的结果。
请注意,在第二个示例中,SELECT 列表中的最后一列本身就是一个完整的 select 语句。它被称为标量子查询,因为它只会 return 1 行/1 列。如果它 returned 多行或多列,则会抛出错误。它也被称为相关子查询,因为它引用了直接超出其范围的内容(在本例中为 e.emp_number)。
SELECT e.emp_number, e.emp_name, e.supv_comments, SUM(i.invoice_amt) As total_sales
FROM employees e INNER JOIN invoices i ON e.emp_number = i.emp_number
GROUP BY e.emp_number, e.emp_name, e.supv_comment
SELECT e.emp_number, e.emp_name, e.supv_comments,
(SELECT SUM(i.invoice_amt) FROM invoices i WHERE i.emp_number = e.emp_number) As total_sales
FROM employees e
我正在使用 ADODB 在 Sheet1 上查询。如果我在 sheet 上使用 SQL 查询获取数据,如下所示,而没有分组,我将从评论中获取所有字符。
但是,如果我使用分组,我的字符将被截断为 255。
注意 – 我的第一行包含 800 个字符,因此驱动程序已正确识别数据类型。
这是我没有分组的查询输出
Select Product, Value, Comment, len(comment) from [sheet1$A1:T10000]
有分组
Select Product, sum(value), Comment, len(comment) from [sheet1$A1:T10000] group by Product, Comment
感谢您 post 这样做!在我使用 ADO 记录集进行 20 多年的数据库开发期间,直到本周我才遇到过这个问题。一旦我追踪到记录集的截断,我真的很抓耳挠腮。在我找到您的 post 并且您让我专注于 GROUP BY 之前,无法想象 how/why 它正在发生。果然,这就是原因(我猜是某种 ADO 错误)。我能够通过将相关的标量子查询放在 SELECT 列表中来解决它,反之使用 JOIN 和 GROUP BY。
详细说明...
10 次中至少有 9 次(根据我的经验)JOIN/GROUP BY 语法可以替换为相关的标量子查询语法,而没有明显的性能损失。在这种情况下这是幸运的,因为 ADO 记录集对象显然存在错误,当字符串长度大于 255 个字符时,GROUP BY 语法会导致文本被截断。
下面的第一个示例使用 JOIN/GROUP BY。第二个使用相关的标量子查询。 would/should 都提供了相同的结果。但是,如果任何评论超过 255 个字符,如果涉及 ADODB 记录集,这两个查询将不会 return 相同的结果。
请注意,在第二个示例中,SELECT 列表中的最后一列本身就是一个完整的 select 语句。它被称为标量子查询,因为它只会 return 1 行/1 列。如果它 returned 多行或多列,则会抛出错误。它也被称为相关子查询,因为它引用了直接超出其范围的内容(在本例中为 e.emp_number)。
SELECT e.emp_number, e.emp_name, e.supv_comments, SUM(i.invoice_amt) As total_sales
FROM employees e INNER JOIN invoices i ON e.emp_number = i.emp_number
GROUP BY e.emp_number, e.emp_name, e.supv_comment
SELECT e.emp_number, e.emp_name, e.supv_comments,
(SELECT SUM(i.invoice_amt) FROM invoices i WHERE i.emp_number = e.emp_number) As total_sales
FROM employees e