0

我在 Word 2007 中遇到了与单词自动化\邮件合并、QueryString 命令和 SQL 语句相关的问题。

如果我使用 select 和 "=" 运算符,一切都会按预期工作。

doc.MailMerge.DataSource.QueryString =
"SELECT * FROM \"TableName\" WHERE \"Id\" = 10";

如果我使用 select 和“LIKE”运算符,它不会:

doc.MailMerge.DataSource.QueryString =
"SELECT * FROM \"TableName\" WHERE \"EmailAddress\" LIKE '%com%'";

看起来 Word 不理解“LIKE”运算符并跳过它。它返回表中的所有记录。

有没有办法在查询字符串中使用“like”?

更新:实际上,MailMerge.Execute 与 LIKE 语句一起正常工作。问题有点不同。系统中有一个地方我们显示 RecordCount (doc.MailMerge.DataSource.RecordCount),它返回不正确的值(它返回表中所有记录的计数)。因此,如果 LIKE 语句在 QueryString 中使用,Word 似乎无法确定记录数。

4

1 回答 1

1

您可以做什么取决于数据源。

如果它是可识别的 Word 文档类型(.doc、.rtf、.docx 等)或 Word 通过文本文件转换器打开的内容,Word 使用非常简单的 SQL 内部方言,只允许您定义所需的字段,简单WHERE条件,和一个简单的ORDER BY. (即,大致可以在“排序/过滤”对话框中执行的操作)。你不明白"LIKE"

如果它是 Jet 数据源,例如 Access 或 Excel,您将获得 SQL 的 Jet 方言,以及 Jet 通配符(? 和 *)或 SQL 标准通配符(_ 和 %),具体取决于源和连接方式. 通常,您应该得到LIKE,并且您应该能够使用 _ 和 %,但不能用于通过 DDE 连接的某些数据库。

对于 SQL Server、Oracle 等其他一切,理论上您会得到适合该服务器的 SQL 方言。但是 Word 用于处理 OLE DB 查询的代码(Office 数据源对象,ODSO)可能会在发送查询字符串之前弄乱它。

从评论中合并的一些注释:

Word 的“排序/筛选”对话框中的“包含”选项会导致 SQL 中出现 LIKE 子句。对于 SQL Server,SQL 子句是这样的:

"LIKE N'%com%'"

(注意“N”)。

一个简单的示例在这里正确过滤(Word 2010+SQL Server 2008 R2,使用默认的 OLE DB 连接和旧的 SQLOLEDB.1 提供程序。如果您通过 ODBC 连接并且列是 Unicode 列(NVARCHAR 等),则会出现问题.) 但是你不会在 Unicode 列中看到任何数据。如果列类型是长类型(例如备忘录)并且 % 需要匹配 128 个字符或类似的字符,则可能会出现问题 - 不记得规则是什么在这种情况下适用于 SQL Server。

SQL Server Profiler 可以成为调查意外查询结果的有用服务器端工具。在这种情况下,OP 发现查询按预期执行,但RecordCount( doc.MailMerge.DataSource.RecordCount) 返回表中所有记录的计数,而不是检索到的记录数。

是否Recordcount返回正确的值取决于 OLE DB 提供程序和/或其设置。由于这个原因,您可能会看到 VBA 示例代码努力测试“最后一条记录”而不是依赖计数。

就个人而言,如果有必要,我会考虑执行一个单独的查询来获取计数(*),但当然,当您进行检索时,实际记录计数可能会发生变化。(FWIW 我怀疑您是否可以在这种情况下使用 SQL 事务来提供帮助,但它可能值得一试)。

于 2012-09-11T16:38:25.023 回答