0

Word 2007でWordの自動化\差し込み印刷、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. (つまり、Sort/Filter ダイアログでできることの大まかに)。わからない"LIKE"

Access や Excel などの Jet データ ソースの場合は、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 など) の場合、問題が発生します。 .) but then you would not see any data in Unicode columns. 列の型がメモなどの長い型で、% が 128 文字などに一致する必要がある場合、問題が発生する可能性があります - 規則が何であるか思い出せませんその場合、SQL Server 用です。

SQL Server プロファイラーは、予期しないクエリ結果を調査するためのサーバー側ツールとして役立ちます。この場合、OP はクエリが期待どおりに実行されていることを発見しましたが、RecordCount( doc.MailMerge.DataSource.RecordCount) は、取得されたレコードの数ではなく、テーブル内のすべてのレコードの数を返します。

正しい値を返すかどうかRecordcountは、OLE DB プロバイダーやその設定によって異なります。このため、カウントに依存するのではなく、「最後のレコード」をテストしようとする VBA サンプル コードが表示される場合があります。

個人的には、必要に応じて別のクエリを実行して count(*) を取得することを検討しますが、もちろん、取得時に実際のレコード数が変わる可能性があります。(FWIW このシナリオで SQL トランザクションを使用できるとは思えませんが、試してみる価値はあります)。

于 2012-09-11T16:38:25.023 に答える