【问题标题】:Lotus Domino NotesSQL ODBC & SQL 2008 queryLotus Domino NotesSQL ODBC 和 SQL 2008 查询
【发布时间】:2013-02-28 03:08:20
【问题描述】:

我正在努力从几个不同的来源获取相同的信息,但在尝试使用 NotesSQL 和 SQL 2008 时遇到了困难。我想做的是从 Domino 上的几个不同视图中检索信息服务器。一个视图是默认视图,另一个是创建的视图。

我使用的一种方法是 Powershell,我在其中获取数据库,然后选择视图,获取第一个文档,然后遍历其余的视图获取我需要的字段。我选择的视图是 People 视图。

我试图使用 SQL 2008 复制同样的东西,使用 NotesSQL 驱动程序,设置 ODBC 连接,然后创建到该 Notes 数据库的链接服务器。我正在使用以下查询从人员视图中进行选择:

select * from openquery(MyNotesServer,'Select * from People')

但是,当我使用 Powershell 并遍历该视图中返回的文档时,从该视图返回的内容不是我能够看到的。 Powershell 在其中显示 100 多列,而 SQL 仅返回 5 列。此外,它们被命名为“_12”、“17”等。一些字段(可能是自定义的,我不知道)有一个有意义的名称。在显示的字段中,我可以按名称(“_12”等)选择它们,但不能选择其他任何内容。行数 (SQL) 与视图中的文档数相同 (Powershell $view.Allentries.Count)。

查询已创建的视图(3 个字段):

select * from openquery(MyNotesServer,'Select * from MyCreatedView')

返回该视图中的所有字段,它们的名称与视图中的一样。

在查询人员视图的 T-SQL 中,您如何获得我在 Powershell 脚本中发现的我知道的列的名称?它们似乎没有被命名为相同的东西,那么当您从视图中select * 时,您如何检索超过返回的 5 个?我已通读 Notes 文档和示例,但无法弄清楚映射到何处。

这背后的原因是想要利用 SQL 和 notes.id 文件而不是运行脚本。另外,我想利用已经存在的全局视图,而不是只有作者才能访问的视图。

【问题讨论】:

  • 这是 Domino 目录吗?如果是这样,对于稍微偏左的建议,为什么不在 Domino 服务器上启用 LDAP?您甚至可以使用 LDAP 提供程序创建链接服务器连接,我推测这是因为我知道您连接到 SQL Server 中的 AD。

标签: sql-server-2008 odbc lotus-notes lotus-domino openquery


【解决方案1】:

首先,在 Lotus Notes 文档中,当您阅读视图时会找到“列”,而不是字段。

其次,这些列配置了一个名为“Programmatic Name”的选项。在该选项中,您可以添加“别名”。 Lotus Notes 默认将值设置为“$12”、“$17”等。问题是 NotesSQL 将“$”更改为“_”。这就是你看到“_12”、“_17”等的原因。

您如何获得原始名称?据我记得(我附近没有 Lotus Notes 进行验证)你不能。但是,您可以使用包含所需数据的列创建另一个视图,并输入适当的名称。最简单的方法是复制/粘贴视图,删除不需要的列,然后根据需要进行更改。

【讨论】:

  • 仅供参考,“$”字段通常是派生或计算的值,而列名通常是基础字段名称。由于计算的值可以基于任何数据组合,因此没有要返回的特定/单个原始基础“字段名称”。程序名称可以任意命名,并且可能并不总是带有 $ 前缀。要确定该列是单个字段还是派生列,可以查询内部“视图属性”,但可能无法通过 ODBC/NotesSQL 访问。在 NotesSQL 中,Notes 中的视图映射到 SQL 表和列,映射到 SQL 字段。
【解决方案2】:

您可以使用select * from Person。 Person 是表单名称,而不是视图名称。 Notes 和 Domino 没有关系。 NSF 文件是一个文档数据库。其中的视图是已经具有隐式选择的预构建索引。即,“人员”视图选择使用“人员”表单创建的所有文档。

上面的查询绕过了视图的使用,将为您提供使用 Person 表单创建的所有文档的所有字段。

实际上,想想看,更好的查询是select * from Person where type='Person'。这是因为 Domino 中的“人物”视图在其选择公式中使用 type="Person" 而不是 form="Person"。理论上可以使用 Person 表单创建文档,但 Type 字段设置为不同的值。这种变化将确保您始终获得您在“个人”视图中看到的相同列表。

但是:无论哪种情况,它都是低效的。 NotesSQL 驱动程序必须执行完整的数据库搜索,而不是简单地读取现有视图的索引。它将使用 Notes 公式 SELECT Form="Person" & Type="Person" 进行搜索。 我真的不建议这样做, 除非您查询的是小型 Domino 目录数据库。

最佳做法是创建一个包含您真正需要的所有字段的视图,然后针对该视图进行查询。

【讨论】:

  • 我正在了解您和马里奥所说的内容。但仍在尝试查询人员(从人员中选择 *)。在 Openquery 命令中使用它。一直返回的是链接服务器返回“[Lotus] [ODBC Lotus Notes] 程序类型超出范围”消息,我无法超越该消息。 SQL 消息是 7330,它说它无法从链接服务器的 OLE DB 提供程序“MSDASQL”中获取一行。
  • 根据我对support.microsoft.com/kb/238774 的阅读,这似乎是数据类型问题。您是否尝试选择 *?或者,即使您只选择了您真正需要的特定项目,也会发生这种情况?
猜你喜欢
  • 1970-01-01
  • 2013-04-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-26
  • 1970-01-01
  • 2010-11-22
  • 2012-05-12
相关资源
最近更新 更多