[SQL Server 问题]当SQL Server 2008 or SQL Server 2005 使用分散式连结(Link Server )至SQL 2000 32 Bit 未升级SP4 执行SQL语法会发生什么事呢?

[SQL Server 问题]当SQL Server 2008 or SQL Server 2005 使用分散式连结(Link Server )至SQL 2000 32 Bit 未升级SP4 执行SQL语法会发生什么事呢?


上周有客户问到SQL Server 2008 64Bit 透过Link Server 的方法连结到SQL Server 2000 32Bit.无法正常使用.建议使用没有效率的openquery来执行.

一开始我还没头序.今天客户一补寄一张图我看了Error message 怪了.这可能是有修正的问题呀.

image

果然一查发现Support 网站有一个KB说明.

当您尝试从 64 位 SQL Server 2005 用户端对连结 32 位 SQL Server 2000 服务器执行分散式查询时,可能会收到错误消息

试想下列状况。您使用 sp_addlinkedserver 预存进程来定义连结 32 位 Microsoft SQL Server 服务器。然后,您试着从 64 位 SQL Server 2005 用户端对连结 32 位 SQL Server 2000 服务器执行分散式查询。在这种状况下,您可能会遭遇下列其中一个症状:

  • 如果 32 位 SQL Server 2000 服务器尚未升级为 SQL Server 2000 Service Pack 3 (SP3) 或 SQL Server 2000 Service Pack 4 (SP4),那么您就会收到下列错误消息:

    The ODBC catalog stored procedures installed on server are version ; version or later is required to ensure proper operation.Please contact your system administrator. (安装在服务器 上的 ODBC 目录预存进程为版本 ;如果要确保作业正确,需要版本 或更新版本。请和系统管理员连络)

  • 如果下列情况皆成立,您就会收到错误消息:
    • SQL Server 2000 SP3 或 SQL Server 2000 SP4 安装在 32 位 SQL Server 2000 服务器上。
    • 32 位 SQL Server 2000 服务器上的系统预存进程的版本,和安装在服务器上的 Service Pack 版本不同。
    错误消息如下:

    The stored procedure required to complete this operation could not be found on the server.Please contact your system administrator. (服务器上找不到完成这项作业所需要的预存进程。请和系统管理员连络)
    Msg 7311, Level 16, State 2, Line 1 (消息 7311,层级 16,状态 2,行 1)
    Cannot obtain the schema rowset "DBSCHEMA_TABLES_INFO" for OLE DB provider "SQLNCLI" for linked server "".The provider supports the interface, but returns a failure code when it is used. (无法为连结服务器 的 OLE DB 提供者 "SQLNCLI" 取得结构描述数据列集 "DBSCHEMA_TABLES_INFO"。提供者支持界面,但在使用时返回失败码。)

注意 当您从 64 位 SQL Server 2005 用户端存取连结 32 位 SQL Server 2000 Desktop Engine (MSDE) 服务器时,也会发生这个问题。

发生的原因

发生这个问题的原因,是因为系统预存进程没有升级为 SQL Server 2000 SP3 或 SQL Server 2000 SP4。您必须手动升级系统预存进程。

解决方案

如果要解决这个问题,请在 32 位 SQL Server 2000 服务器上安装 SQL Server 2000 SP3 或 SQL Server 2000 SP4;然后,在 32 位 SQL Server 2000 服务器上手动执行 SQL Server 2000 SP3 或 SP4 随附的 Instcat.sql 命令码。

如何执行
使用 Windows 验证模式
如果要使用“Windows 验证”模式升级 SQL Server 2000 的 32 位执行个体上的系统预存进程,请依照下列步骤进行:
  1. 以 SQL Server sysadmin 固定服务器角色成员的 Windows 账户登入电脑。
  2. 按一下 [执行],输入 cmd.exe,然后按一下 [确定]
  3. 在命令提示符中输入下列其中一个命令,然后按下 ENTER:
    对于默认执行个体

    osql -E -S  -i instcat.sql

    对于具名执行个体

    osql -E -S  -i instcat.sql

    注意 代表连结的服务器名称、执行个体名称以及含有 Instcat.sql 命令码的数据夹完整路径。根据默认,这个数据夹位于 C:Program FilesMicrosoft SQL ServerMSSQLInstall。

使用 SQL Server 验证模式
如果要使用“SQL Server 验证”模式升级 SQL Server 2000 的 32 位执行个体上的系统预存进程,请依照下列步骤进行:
  1. 使用任何 Windows 账户登入电脑。
  2. 按一下 [执行],输入 cmd.exe,然后按一下 [确定]
  3. 在命令提示符中输入下列命令,再按下 ENTER 键:
    对于默认执行个体

    osql -U  -P  -S  -i instcat.sql

    对于具名执行个体

     
    osql -U  -P  -S  -i instcat.sql
    

    注意 代表 SQL Server sysadmin 固定服务器角色成员的使用者账户。

注意 在您执行 Instcat.sql 命令码之后,会产生许多消息,最后一个消息会指出命令码是否执行成功。

Support 网站写的是SQL 2005并且下列的版本也要做这些更新事项:

  • Microsoft SQL Server 2005 Standard x64 Edition Community Technology Preview
  • Microsoft SQL Server 2005 Developer x64 Edition Community Technology Preview

Support 的KB是KB906954

那SQL 2008 为何也发生此问题呢?并且如何处理?

败了一下Google大神.发现到好文章:

来自于一个外国人的文章http://hilltopsit.blogspot.com/2009/05/development-cannot-obtain-schema-rowset.html.同样发生过个问题.解决方法也相同

Friday, May 8, 2009
DEVELOPMENT: Cannot obtain the schema rowset "DBSCHEMA_TABLES_INFO" for OLE DB provider "SQLNCLI" for linked server
Running a query from SQL Server 2008 over a linked server connection to a SQL Server 2000 server causes the following error:

OLE DB provider "SQLNCLI10" for linked server "mylinkedserver" returned message "Unspecified error".
OLE DB provider "SQLNCLI10" for linked server "mylinkedserver" returned message "The stored procedure required to complete this operation could notbe found on the server. Please contact your system administrator.".
Msg 7311, Level 16, State 2, Line 1
Cannot obtain the schema rowset "DBSCHEMA_TABLES_INFO" for OLE DB provider interface, but returns a failure code when it is used.

Or

The stored procedure required to complete this operation could not be found on the server. Please contact your system administrator.
Msg 7311, Level 16, State 2, Line 1
Cannot obtain the schema rowset "DBSCHEMA_TABLES_INFO" for OLE DB provider "SQLNCLI" for linked server "". The provider supports the interface, but returns a failure code when it is used.


Firstly, SQL Server 2000 SP4 (service pack 4) must be installed.

Then the system stored procedures must be manually upgraded.



Note that when manually upgrading the system stored procedures, we used SQL Server Authentication mode which requires the syntax:
osql -U [adminlogin]-P [adminpassword]-S [linkedservername]-i [location]instcat.sql



We first entered the line as:
osql -U sa -P myPassword -S myServer -i C:Program FilesMicrosoft SQL ServerMSSQLInstallinstcat.sql



But this just bought up the osql help /? list of parameters. To avoid this, make sure that the -i path is in speech marks!

osql -U sa -P myPassword -S myServer -i "C:Program FilesMicrosoft SQL ServerMSSQLInstallinstcat.sql"



Note that the manual upgrade takes a couple of minutes to run and there are a whole bunch of message and numbers displayed in the command window as it executes. If the process is successful, then the last but one line will read "instcat.sql completed successfully".

In our experience, the SQL Service did not need to be restarted, the fix worked immediately and we were able to query the SQL Server 2000 server from SQL Server 2008 over the link immediately:
SELECT COUNT(*)
FROM myLinkedServer.myDatabase.dbo.myTable

We hope that this tip helps others new to SQL Server 2008 development!



我因此去找了SP4的更新的说明.我发现更新说明早就说明清楚请更新SP4时若使用连结服务器要做下列的动作

3.7 升级连结服务器的目录
当您将 SQL Server 2000 数据库引擎的执行个体升级至 Database Components SP4 时,可能必须确认某些系统的预存进程是否已在其他 SQL Server 或 MSDE 的执行个体中升级。

Database Components SP4 包含了将 Microsoft Data Access Components (MDAC) 升级至 2.8 SP1 MDAC 版的程序。MDAC 2.8 SP1 包含了升级 SQLOLEDB 提供者与 SQL Server ODBC 驱动程序的程序。如需相关资讯,请参阅 1.3 小节确认 Microsoft Data Access Components 的版本。当提供者或驱动程序连线至 SQL Server 或 MSDE 的执行个体时,提供者或驱动程序会使用一组称为目录预存进程的系统预存进程。执行个体上的目录预存进程版本,必须与提供者或驱动程序所使用的版本相同,甚至更新。若您尝试连接目录预存进程版本较旧的 SQL Server 或 MSDE 执行个体,则会收到下列错误:

The ODBC catalog stored procedures installed on server
are version ; version or later
is required to ensure proper operation. Please contact your system
administrator.

[回到页首]

执行 Instcat.sql 命令码
每个版本的提供者与驱动程序都会随附名为 Instcat.sql 的命令码。Instcat.sql 可针对任何目录版本较旧的 SQL Server 或 MSDE 执行个体,升级其中的目录预存进程。

安装 Database Components SP4 后,您必须针对任何版本比 SQL Server 2000 SP4 旧,而且具有下列特性的 SQL Server 或 MSDE 执行个体,执行 Database Components SP4 所提供的 Instcat.sql 命令码:

存取这个执行个体的应用程序会使用 SQLClient Managed 命名空间、ADO、OLE DB 或 ODBC 的应用程序,并且执行于安装有 SQL Server 2000 SP4 的电脑上。


在 SQL Server 2000 SP4 执行个体上执行的分散式查询会参考这个执行个体。分散式查询会包含您以 sp_addlinkedserver 以及 OPENROWSET 与 OPENQUERY 函数所定义之连结服务器项目的参考。
使用 Windows 验证模式升级执行个体上的目录预存进程:

使用属于 SQL Server sysadmin 固定服务器角色成员的登入,来登入 Windows。


开启命令提示符窗口。


执行 osql 公用程序:
若为默认执行个体,请执行:
osql -E -SComputerName -ilocationinstcat.sql
若为具名执行个体,请执行:
osql -E -SComputerNameInstanceName -ilocationinstcat.sql
使用混合模式升级执行个体上的目录预存进程:

使用任何登入来登入 Windows。


开启命令提示符窗口。


执行 osql 公用程序:
若为默认执行个体,请执行:
osql -UAnAdminLogin -PAdminPassword -SComputerName
-ilocationinstcat.sql
若为具名执行个体,请执行:
osql -UAnAdminLogin -PAdminPassword
-SComputerNameInstanceName -ilocationinstcat.sql
其中:

AnAdminLogin 是属于 sysadmin 固定服务器角色成员的 SQL Server 登入。


AdminPassword 是 AnAdminLogin 的密码。


ComputerName 是 SQL Server 或 MSDE 执行个体执行所在的电脑名称。


InstanceName 是 SQL Server 2000 或 MSDE 2000 具名执行个体的名称。


location 是 Instcat.sql 所在数据夹的完整路径。SQL Server 2000 执行个体的默认安装位置是 c:program filesMicrosoft SQL ServerMSSQLInstall。
Instcat.sql 命令码可产生许多消息。通常这些消息并不会指出任何错误;它们只是通知您命令码中的每个 Transact-SQL 陈述式各影响到多少数据列。最后一则消息应会指出命令码的执行是否成功。



所以更新前请记得看一下文档勒各位同学.有学到了吗??..我学到了.你呢?





请大家永跃参与Facebook MSBI 粉思团:http://www.facebook.com/#!/group.php?gid=303757165010