Mailmerge,querystring返回不正确的记录集



我遇到了与单词自动化\mailmerge、QueryString命令有关的问题以及Word 2007中的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"?

UPDATE:实际上,MailMerge.Execute可以正确地使用LIKE语句。问题有点不同。在系统中的某个位置,我们显示RecordCount(doc.MailMerge.DataSource.RecordCount),但它返回了不正确的值(它返回了表中所有记录的计数)。若like语句在QueryString中使用,看起来Word无法确定记录数。

您能做什么取决于数据源。

如果是公认的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 Data Source Object,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发现查询按预期执行,但RecordCountdoc.MailMerge.DataSource.RecordCount)返回表中所有记录的计数,而不是检索到的记录数。

Recordcount是否返回正确的值取决于OLE DB访问接口和/或其设置。由于这个原因,您可能会看到VBA示例代码试图测试"最后一条记录",而不是依赖计数。

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

相关内容

最新更新