使用Word中的命令文本连接数据(就像在Excel中一样)

问题描述 投票:0回答:1

我正在尝试将合并的信件(许多不同的Word文件,包含许多不同的信件)与使用我们公司的数据库动态编写的SQL查询提供的数据进行邮件合并。

例如,在Excel中,我可以使用ODBC数据库连接,然后在该数据库连接的属性中指定SQL“命令文本”,以便即时为当前正在使用的文件创建查询。

我只是在SSMS中创建查询,然后将其粘贴到在Excel中创建的连接的属性中的”命令文本”中。

我对许多Excel文件使用相同的连接,但是根据每个特定Excel文件表中所需的数据使用不同的命令文本。

我只是无法弄清楚如何在Word中执行类似的操作,因此我可以使用提供提供邮件合并所需数据的自定义SQL查询。

当邮件合并发生时,SQL查询必须始终使用数据库中的实时数据。它们不能是静态查询,因为这些字母包含字母收件人每天(在数据库中)每天变化的数据。

有什么想法吗?

sql-server ms-word odbc database-connection
1个回答
0
投票

Word中没有等效的位置可以让您指定SQL查询。 Word的整个查询方法是“在一个对话框中选择一个表/视图/查询,然后指定列,在“编辑收件人列表”对话框中指定一些基本的排序和过滤,然后构建查询。”

因此,您需要使用代码将Word连接到数据(基本上,您将使用适当的参数调用ActiveDocument.MailMerge.OpenDataSource),或者您需要通过中介获取数据,而不必提供根本没有对Word的详细查询。

例如,如果您具有必要的SQL Server权限,则可以获取在SMSS中开发的查询,并使用它来创建视图,然后将其用作数据源。 (如果您不需要重新使用这些数据源或将其保存为文档目的,则可以只为每个所需的合并创建一个这样的View。)IMO如果您能够做到这一点,那就可能是解决此问题的最简单方法。

或者也许您可以使用Excel作为中间数据源(您已经创建或重复使用工作表,已经创建/修改了它的连接/查询),获取了数据,保存了工作簿并将其用作数据资源。您可能需要处理一些限制,例如Word只能从Excel数据源中检索255或256列,Word可能在处理Excel列中的混合数据类型时遇到问题,等等。]

对于少量数据,您甚至可以使用包含{ DATABASE }字段的Word文档作为中间数据源。例如,如果您有一个带有相关连接信息的.odc。名为c:\odcs\myodc.odc,并且您有一个查询SELECT * FROM mytable WHERE myfield < 1000,则需要一个类似以下的字段:

{ DATABASE \d "c:\\odcs\\myodc.odc" \s "SELECT * FROM mytable WHERE myfield < 1000" }

((您在Windows Word上使用ctrl-F9插入特殊字段括号对{},然后键入其他所有内容。通常最好先保存文档,然后再执行该字段。选择该字段并按F9,然后使用Alt- F9在域代码和域结果之间切换。)

我之所以说“小”,是因为如果查询检索到大量的行,否则Word很可能会挂起,而检索大量的列可能会导致其他问题。

但是这有问题。 Word对于查询语法非常挑剔,因此您不能仅在数据库字段或对.OpenDataSource的调用中使用任何可以在SSMS中正常工作的旧查询。例如,为了使上述查询在DATABASE字段中起作用,我必须将其更改为

SELECT * FROM mytable WHERE mytable.myfield < 1000

[有时Word坚持将表名包装在定界符中(例如,“”或[]),或者为表名加上别名。另外,OpenDataSource和DATABASE字段都限制了查询中的字符数。对于OpenDataSource,绝对最大为511或512个字符,对于超过255个字符的任何内容,您都必须将查询字符串一分为二。

所有这些都是为什么我实际上认为您最好创建一个View并使用它,如果可以的话。

如果要使用OpenDataSource方法,则无论如何都必须编写一些VBA,因此最简单的方法是创建一个带有OpenDataSource语句的VBA宏,该宏可能存储在WOrd的Normal模板中。然后,要设置数据源,请打开邮件合并主文档,使其成为Word中的“ ActiveDocument”,打开VB编辑器,打开该宏,复制/粘贴SQL文本,并根据需要进行修改与Word的SQL语法要求。然后运行它。

例如对于最多255个字符的查询,您的宏可能如下所示:

Sub ConnectToDataSource()
ActiveDocument.MailMerge.OpenDataSource _
  Name:="the full path and file name of a suitable .odc file" , _
  SQLStatement:="the sql statement"
End Sub

。odc将需要包含连接信息。另外,您可以使用空白的.odc并将连接信息放入通话中:

ActiveDocument.MailMerge.OpenDataSource _
  Name:="the full path and file name of a suitable .odc file" , _
  Connection:="Provider=SQLOLEDB.1;Integrated Security=SSPI; etc.", _
  SQLStatement:="the sql statement"

对于更长的查询,您需要

ActiveDocument.MailMerge.OpenDataSource _
  Name:="the full path and file name of a suitable .odc file" , _
  SQLStatement:="part 1 of the SQL query", _
  SQLStatement1:="part 2 of the SQL query"

((当您这样做时,Word将两个查询串联在一起,不带空格,因此例如,如果您使用

  SQLStatement:="SELECT * FROM mytable", _
  SQLStatement1:="WHERE myfield < 10"

您的查询实际上是

SELECT * FROM mytableWHERE myfield < 10

返回到我的示例查询,我不得不再次对其进行修改以在需要此语法的OpenDataSource中使用它:

ActiveDocument.MailMerge.OpenDataSource _
  Name:="the full path and file name of a suitable .odc file" , _
  SQLStatement:="SELECT * FROM ""ktd1"" WHERE k < 10"

Word连接而不是Excel连接可能遇到的另一个问题是,如果使用ODBC驱动程序进行连接,则Unicode格式文本字段内容将无法到达Word。您可以使用OLE DB提供程序来避免这种情况。

最后,当您在Word中建立与SQL Server之类的数据库的新连接时,Word会生成一个.odc文件,其中包含连接和表信息。尽管这看起来像是一种通用工具,它使您可以通过修改其中的<odc:CommandText>元素值以包含查询来指定所需的任何查询(甚至可以将<odc:CommandType>修改为“ SQL”而不是“表格”),我尝试过的任何方法都无法真正起作用。实际上,Word似乎忽略了<odc:CommandText>,实际上是从文件中的<meta name=Table content=thetablename>中获取其表名。因此,您不能只编辑.odc文件来实现您的目标。

© www.soinside.com 2019 - 2024. All rights reserved.