如何链接不同的数据源






4.52/5 (8投票s)
2005年6月12日
11分钟阅读

129800
介绍如何将SQL Server与许多不同的数据源(例如Active Directory Application Mode目录、Microsoft Indexing Server目录、Microsoft Access数据库和Microsoft Excel电子表格)链接起来。还解释了如何使用OPENQUERY命令查询链接服务器。
引言
在当今的企业中,各种类型的数据存储在不同的数据仓库中。关系型数据最有可能存储在SQL Server数据库或Oracle数据库中。许多企业应用程序都有自己的数据库,包含自己的数据和数据模型。用户和帐户信息存在于Active Directory或Active Directory Application Mode等目录中。有关目录服务的更多信息,请参阅以下文章。更小、更灵活、更易于移动的数据存在于Excel电子表格或Microsoft Access数据库中。每个企业都有大量的Word文档、Excel电子表格、HTML文档等文件存储在文件系统中。使用Microsoft Indexing Server为文件系统或Web服务器上的所有文件建立索引是一种常见的做法。Microsoft Indexing Server会创建一个索引目录,并提供一个SQL查询接口,让您可以轻松地搜索索引。有关Microsoft Indexing Server的更多信息,请参阅以下文章。
企业现在面临的挑战是如何提供一个完整且易于访问的视图来查看所有这些存储在各种存储中的数据。更重要的是,如何在不创建许多不同接口或复杂搜索机制的情况下搜索各种数据源中的所有数据?好消息是,大多数这些数据存储都提供了SQL查询语言。SQL语言在不同数据源之间略有差异。例如,Active Directory等目录提供了查询功能,但不允许您通过SQL语言进行更新、插入或删除。Microsoft Indexing Server的SQL语言也是如此。但大多数数据源都提供了基本的SQL查询功能。此外,Microsoft SQL Server允许您链接到提供SQL查询语言的其他数据存储。这使您可以创建跨越多个数据源的单个SQL查询。本文将介绍如何实现这一点。
将其他数据存储链接到Microsoft SQL Server
Microsoft SQL Server提供了链接到提供SQL查询语言的其他数据源的功能。SQL Server的Enterprise Manager在左侧导航窗格中显示“SQL Server组”,并在每个组下显示所有数据库服务器。“(local)”表示本地数据库服务器。您可以将其他数据存储链接到单个数据库服务器。展开数据库服务器,您会找到一个名为“Security”的条目。展开“Security”条目,您会看到一个名为“Linked Servers”的条目。展开“Linked Servers”条目,您可以看到所有已链接到此数据库服务器的数据存储。
要链接新的数据存储,请右键单击“Linked Servers”条目,然后从弹出菜单中选择“New Linked Server”。在“Linked Server Properties”对话框中,您可以为此链接服务器输入一个名称,然后选择是要链接另一个SQL Server数据库还是任何其他数据源。如果您选择“SQL Server”,则链接服务器名称必须是您要链接的SQL Server数据库的名称。例如,如果您在Enterprise-Minds计算机上运行另一个SQL Server数据库,则链接服务器名称将为“Enterprise-Minds”。如果您选择“Other data source”,则需要从现有数据源提供商列表中进行选择,例如“Microsoft Jet 4.0 OLE Provider”。根据选择的提供商,您需要输入产品名称、数据源、提供商字符串、位置和目录。完成后,单击OK以创建到此新数据存储的链接。此新数据源现在将显示在“Linked Servers”下,显示您输入的名称。
将Microsoft SQL Server链接到目录
您可以将SQL Server链接到Active Directory或Active Directory Application Mode等目录。在Enterprise Manager中创建一个链接服务器,并为其命名,例如“Active Directory Link”。选择“Other data source”选项,然后选择数据提供商“OLE DB Provider for Microsoft Directory Services”。产品名称输入“Active Directory Services”,数据源输入“adsdatasource
”。展开新的链接服务器后,您会发现两个可用项:Tables和Views。因此,SQL Server允许您查看此数据源中的任何表或视图。但是,数据提供商“OLE DB Provider for Microsoft Directory Services”不提供表或视图。因此,您将收到错误“Error 7301: Could not obtain a required interface from OLEDB provider ADsDSOObject”。您可以安全地忽略此错误消息。您将能够通过SQL查询语言查询数据存储。
重要的是,您需要使用具有目录访问权限的帐户来运行“MSSQLSERVER”服务。如果您在本地系统帐户下运行服务,则在尝试查询数据存储时会收到以下错误。
Server: Msg 7321, Level 16, State 2, Line 1
An error occurred while preparing a query for
execution against OLE DB provider 'ADsDSOObject'.
OLE DB error trace [OLE/DB Provider 'ADsDSOObject'
CommandPrepare::Prepare returned 0x80040e14].
因此,如果目录在您的本地计算机上运行,并且本地用户“DirectoryUser
”有权访问它,则需要在此帐户下运行“MSSQLSERVER”服务。如果目录在域中的某个位置运行,并且域用户“DomainUser
”有权访问它,则需要在此域帐户下运行“MSSQLSERVER”服务。
将Microsoft SQL Server链接到Microsoft Indexing Server目录
您还可以将SQL Server链接到Indexing Server目录。创建一个新的链接服务器,并为其命名,例如,如果您链接到Web Indexing Server目录,则命名为WEBCATALOG
。接下来选择“Other data source”,并将数据提供商选择为“Microsoft OLE DB Provider for Indexing Service”。输入产品名称“Index Server”,数据源输入Indexing Server目录的名称,例如Web。展开新的链接服务器后,您会发现两个可用项:Tables和Views。因此,SQL Server允许您查看此数据源中的任何表或视图。但是,数据提供商“Microsoft OLE DB Provider for Indexing Service”不提供表或视图。因此,您将收到错误“Error 7301: Could not obtain a required interface from OLEDB provider MSIDXS”。您可以安全地忽略此错误消息。您将能够通过SQL查询语言查询数据存储。
将Microsoft SQL Server链接到Microsoft Access数据库
SQL Server也可以链接到Microsoft Access数据库。创建一个新的链接服务器,并为其命名,例如“Booklist
”。接下来选择“Other data source”,并将数据提供商选择为“Microsoft Jet 4.0 OLE DB Provider”。输入产品名称“Access”,数据源输入Microsoft Access文件的路径,例如“c:\My files\Books.mdb”。此数据提供商能够显示表和视图的列表。因此,当您展开此链接服务器下的Table或View项时,您将看到Microsoft Access数据库中的表或视图列表。
将Microsoft SQL Server链接到Microsoft Excel电子表格
SQL Server也可以链接到Microsoft Excel电子表格。创建一个新的链接服务器,并为其命名,例如“Booklist
”。接下来选择“Other data source”,并将数据提供商选择为“Microsoft Jet 4.0 OLE DB Provider”。输入产品名称“Jet 4.0”,数据源输入Microsoft Excel电子表格的路径——例如“c:\My files\Books.xls”——最后,在提供商字符串中输入“Excel 5.0”。此数据提供商在Tables下显示Excel工作表的列表。它不显示任何Views。
还有许多其他提供商可供选择,这些提供商允许您将SQL Server与各种不同的数据源链接起来。以下链接列出了一些可供SQL Server使用的可用数据提供商。
如何查询链接服务器?
现在我们已经学会了如何将SQL Server与各种不同的数据存储链接起来。要查询链接服务器中的数据,您可以在FROM
子句中使用OPENQUERY
命令,这意味着您可以查询链接服务器而不是标准的SQL Server表或视图。OPENQUERY
命令需要两个参数。第一个是链接服务器的名称,后跟您想在该链接服务器上执行的查询。以下示例假设您有一个名为Books的链接服务器,其中有一个名为Books的表。
SELECT * FROM OPENQUERY(Books, 'SELECT * FROM Books') AS Books
OPENQUERY
命令传递的查询需要由链接的数据提供商支持。因此,根据数据提供商的不同,可能会略有差异。您可以将任何链接数据源或SQL Server表中的数据连接在一起。下一个示例假设您正在查询一个链接数据源,并将其与名为BookValue的SQL Server表连接在一起。
SELECT * FROM OPENQUERY(Books, 'SELECT * FROM Books') AS Books INNER JOIN
BookValue ON Books.ID = BookValue.ID
如何查询目录?
“OLE DB Provider for Microsoft Directory Services”接受两种不同的语法。一种称为LDAP方言,另一种称为SQL方言。顾名思义,SQL方言遵循SQL语言语法。对于SELECT
关键字,您指定要查询的目录属性。对于ORDER BY
和WHERE
关键字,您指定要排序和过滤的属性。对于FROM
关键字,您指定要查询的目录和目录容器。以下示例查询Enterprise-Minds目录中的“OU=Enterprise-Minds,CN=Vancouver
”容器。它返回通用名称,并且只返回类型为group的目录对象。
SELECT * FROM OPENQUERY(ADAM,
'SELECT cn FROM ''LDAP://Enterprise-Minds/OU=Enterprise-Minds,
CN=Vancouver'' WHERE objectClass=''group'' ')
请注意,FROM
子句需要放在两个单引号内(在已用单引号括起来的字符串中转义单引号)。以下示例查询Enterprise-Minds目录中的“OU=Enterprise-Minds,CN=Vancouver
”容器中所有目录对象的通用名称和ADS路径。
SELECT * FROM OPENQUERY(ADAM,
'SELECT cn, ADsPath FROM ''LDAP://Enterprise-Minds/OU=Enterprise-Minds,
CN=Vancouver'' ')
LDAP方言由四个部分组成,每个部分用分号分隔。第一部分指定目录和目录容器,第二部分指定过滤器,第三部分指定要返回的属性列表,最后一部分指定搜索范围。范围部分可以有三个值:Base
、OneLevel
和SubTree
。Base
仅搜索您指定的目录路径。OneLevel
搜索您指定的目录路径的直接子级。SubTree
搜索您指定的目录路径的所有后代。以下示例返回与第一个SQL方言示例相同的信息——所有组对象的列表。
SELECT * FROM OPENQUERY(ADAM,
'<LDAP://Enterprise-Minds/OU=Enterprise-Minds,CN=Vancouver>;
(objectClass=group);cn;subtree')
下一个示例返回与第二个SQL方言示例相同的信息——所有目录对象的通用名称和ADS路径。
SELECT * FROM OPENQUERY(ADAM,
'<LDAP://Enterprise-Minds/OU=Enterprise-Minds,CN=Vancouver>;;
cn,ADsPath;subtree')
您可以在以下文章中找到有关可能的过滤器语法的更多信息。过滤器语法适用于两种方言,区别在于值需要用单引号括起来,用于SQL方言。例如,您可以看到SQL方言示例中的值是用单引号括起来的(双单引号用于转义),而在LDAP方言示例中则不是。
如何查询Indexing Server目录?
有关如何查询Indexing Server目录的详细说明,请参阅以下文章。以下示例查询链接的Web Indexing Server目录中所有文件的文件名、路径和虚拟路径。
SELECT * FROM OPENQUERY(WEBCATALOG, 'SELECT FileName,
Path, VPath FROM SCOPE()')
下一个示例查询包含“default
”值,并且位于“/Info”虚拟目录及其所有子目录下的所有文件。对于所有匹配项,它将返回文件名、路径和虚拟路径。
SELECT * FROM OPENQUERY(WEBCATALOG, 'SELECT FileName, Path, VPath FROM
SCOPE(''DEEP TRAVERSAL OF("/Info")'') WHERE CONTAINS(FileName,''default'') ')
请注意,SCOPE
函数中的值用双单引号进行转义,而DEEP TRAVERSAL OF
函数的值根据Indexing Server SQL语法用双引号括起来。如所示,您可以创建非常复杂的查询。
如何查询Excel电子表格?
链接的Excel电子表格中的所有工作表都显示为表。请注意,所有表名末尾都有一个$符号。另外,如果工作表名称中有空格,您会看到用单引号括起来的表名,但在查询中通常会删除这些单引号。查询字符串中的表名需要用方括号括起来。以下示例查询名为Summary的工作表中的所有条目。
SELECT * FROM OPENQUERY(Books, 'SELECT * FROM [Summary$]')
重要的是Excel电子表格未在Excel中打开,否则您将收到以下错误。
Server: Msg 7399, Level 16, State 1, Line 1
OLE DB provider 'Microsoft.Jet.OLEDB.4.0' reported an error.
The provider did not give any information about the error.
OLE DB error trace [OLE/DB Provider 'Microsoft.Jet.OLEDB.4.0'
IDBInitialize::Initialize returned 0x80004005: The provider
did not give any information about the error.].
摘要
本文介绍了如何将SQL Server与许多不同的数据源链接起来。它逐步介绍了如何将SQL Server链接到Active Directory Application Mode等目录、Microsoft Indexing Server目录、Microsoft Access数据库和Microsoft Excel电子表格。它还解释了如何使用SQL的OPENQUERY
命令查询链接服务器。最后,它解释了目录查询、Indexing Server目录查询和Excel电子表格查询的查询语法。对Microsoft Access数据库的查询使用与您从SQL Server习惯使用的相同的SQL语法。
Microsoft SQL Server提供了一种强大的方法来链接许多不同的数据存储,并提供一个通用的查询接口。这使得应用程序很容易为企业中的大多数数据存储提供通用的查询功能。开发社区对此功能不太了解。如果您需要查询多个不同的数据源并提供一个通用的查询接口和搜索结果,利用它将大大简化您的应用程序。如果您对本文或此主题有任何意见,请通过klaus_salchner@hotmail.com与我联系。我很想知道您是否学到了新东西。如果您对此主题或本文有任何疑问,请与我联系。