[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 怪了.這可能是有修正的問題呀.
果然一查發現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 <LinkedServerName> are version <OldVersionNumber>; version <NewVersionNumber> or later is required to ensure proper operation.Please contact your system administrator. (安裝在伺服器 <LinkedServerName> 上的 ODBC 目錄預存程序為版本 <OldVersionNumber>;如果要確保作業正確,需要版本 <NewVersionNumber> 或更新版本。請和系統管理員連絡)
- 如果下列情況皆成立,您就會收到錯誤訊息:
- 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 "<LinkedServerName>".The provider supports the interface, but returns a failure code when it is used. (無法為連結伺服器 <LinkedServerName> 的 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 位元執行個體上的系統預存程序,請依照下列步驟進行:
- 以 SQL Server sysadmin 固定伺服器角色成員的 Windows 帳戶登入電腦。
- 按一下 [執行],輸入 cmd.exe,然後按一下 [確定]。
- 在命令提示字元中輸入下列其中一個命令,然後按下 ENTER:
對於預設執行個體
osql -E -S <LinkedServerName> -i <Location>\instcat.sql對於具名執行個體
osql -E -S <LinkedServerName>\<InstanceName> -i <Location>\instcat.sql注意<LinkedServerName>、<InstanceName> 和 <Location> 代表連結的伺服器名稱、執行個體名稱以及含有 Instcat.sql 指令碼的資料夾完整路徑。根據預設,這個資料夾位於 C:\Program Files\Microsoft SQL Server\MSSQL\Install。
使用 SQL Server 驗證模式
如果要使用「SQL Server 驗證」模式升級 SQL Server 2000 的 32 位元執行個體上的系統預存程序,請依照下列步驟進行:
- 使用任何 Windows 帳戶登入電腦。
- 按一下 [執行],輸入 cmd.exe,然後按一下 [確定]。
- 在命令提示字元中輸入下列命令,再按下 ENTER 鍵:
對於預設執行個體
osql -U <AdminLogin> -P <AdminPassword> -S <LinkedServerName> -i <Location>\instcat.sql對於具名執行個體
osql -U <AdminLogin> -P <AdminPassword> -S <LinkedServerName>\<InstanceName> -i <Location>\instcat.sql注意<AdminLogin> 和 <AdminPassword> 代表 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 Files\Microsoft SQL Server\MSSQL\Install\instcat.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 Files\Microsoft SQL Server\MSSQL\Install\instcat.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 <ServerName>
are version <OldVersionNumber>; version <NewVersionNumber> 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 -ilocation\instcat.sql
若為具名執行個體,請執行:
osql -E -SComputerName\InstanceName -ilocation\instcat.sql
使用混合模式升級執行個體上的目錄預存程序:
使用任何登入來登入 Windows。
開啟命令提示字元視窗。
執行 osql 公用程式:
若為預設執行個體,請執行:
osql -UAnAdminLogin -PAdminPassword -SComputerName
-ilocation\instcat.sql
若為具名執行個體,請執行:
osql -UAnAdminLogin -PAdminPassword
-SComputerName\InstanceName -ilocation\instcat.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 files\Microsoft SQL Server\MSSQL\Install。
Instcat.sql 指令碼可產生許多訊息。通常這些訊息並不會指出任何錯誤;它們只是通知您指令碼中的每個 Transact-SQL 陳述式各影響到多少資料列。最後一則訊息應會指出指令碼的執行是否成功。
所以更新前請記得看一下文件勒各位同學.有學到了嗎??..我學到了.你呢?
請大家永躍參與Facebook MSBI 粉思團:http://www.facebook.com/#!/group.php?gid=303757165010