2012-09-11 21 views
0

我有相關的詞自動化\郵件合併的問題,查詢字符串命令 和SQL語句在Word 2007中郵件合併,查詢字符串返回不正確的記錄

如果我使用select和預期「=」操作,一切工作。

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

如果我使用select和 「LIKE」 操作符,它並不:

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

貌似字不明白 「LIKE」 操作符,只是跳過它。它返回表中的所有記錄。

有沒有什麼方法可以在查詢字符串中使用「like」?

UPDATE:實際上,MailMerge.Execute與LIKE語句一起工作正常。問題有點不同。系統中有我們顯示RecordCount(doc.MailMerge.DataSource.RecordCount)的地方,它返回不正確的值(它返回表中所有記錄的計數)。因此,如果在QueryString中使用LIKE語句,Word看起來不能確定記錄數。

回答

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方言。但是,用於處理OLE DB查詢(Office數據源對象,ODSO)的代碼Word可以在發送查詢字符串之前處理這些查詢字符串。

一些筆記註釋合併:

「包含」在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事務來幫助在這種情況下,但它可能值得一試)。

+0

感謝您的答案,我們從SQL服務器獲取數據,所以我想知道爲什麼它不工作...排序/過濾器對話框有「包含」選項,所以它應該瞭解「喜歡」以及...但事實並非如此。 –

+0

我使用* .odc文件作爲收件人的數據源。 Word 2007 + SQL Server 2008 R2,默認的OLE DB連接和舊的SQLOLEDB.1提供程序。過濾器可以正常工作,如果我手動執行mailmerge,但是如果我從代碼執行,則不起作用... EmailAddress列在表中是varchar(200)。 –

+0

感謝您的建議......我用SQL分析器進行了研究,並且發現了更多有趣的事情,所以我認爲我已經接近解決問題了......實際上,MailMerge.Execute與LIKE語句正常工作。問題有點不同。系統中有我們顯示RecordCount(doc.MailMerge.DataSource.RecordCount)的地方,它返回不正確的值(它返回表中所有記錄的計數)。因此,如果在QueryString中使用LIKE語句,Word看起來不能確定記錄數。 –