SQL Server 2005 中對於 Database Engine 的突破性變更

更新: 2008 年 11 月 17 日

此主題描述對 Microsoft SQL Server 2005 的 Database Engine 所做的變更,對於以舊版 SQL Server 為基礎的應用程式是一項突破。

用戶端/伺服器連接

功能 描述

Banyan VINES Sequenced Packet Protocol (SPP)、多重通訊協定、AppleTalk 或 NWLink IPX/SPX 網路通訊協定

SQL Server 2005 不支援 Banyan VINES Sequenced Packet Protocol (SPP)、多重通訊協定、AppleTalk 或 NWLink IPX/SPX 網路通訊協定。若要連接到 SQL Server 2005,用戶端應用程式必須使用支援的通訊協定。如果設定的別名使用其中一個不支援的通訊協定,該別名必須修改為使用其中一個支援的通訊協定。

如果應用程式連接字串以下列其中一種方式,來特別使用或載入其中一個不支援的通訊協定,則您必須將應用程式修改為使用其中一個支援的通訊協定,方法是指定 NETWORK=DBMSRPCN 給 RPC、NETWORK=DBMSADSN 給 Appletalk 或 NETWORK=DBMSVINN 給 Banyan VINES 屬性,或使用明確前置詞,例如 spx:server\instance 用於 SPX、bv:server 用於 Banyan VINES、adsp:server 用於 AppleTalk,或 rpc:server 用於多重通訊協定。

如需詳細資訊,請參閱<選擇網路通訊協定>。

MDAC

比 MDAC 2.6 更舊的 MDAC 版本不支援具名執行個體。若要讓應用程式連接至具名執行個體,請升級到目前的 MDAC 版本。

Winsock proxy

Winsock Proxy 無法使用 SQL Server 工具來設定。如需有關如何設定 Winsock Proxy 的資訊,請參閱 Proxy 伺服器文件集。

組態選項

功能

描述

AUTO_UPDATE_STATISTICS

在升級任何資料庫之前,請將 AUTO_UPDATE_STATISTICS 設定為 ON。否則,無法更新資料庫統計資料,做為 SQL Server 2005 升級的一部分。依賴舊版的 SQL Server 的統計資料,可能會使查詢計劃無法最佳化。若將 AUTO_UPDATE_STATISTICS 設定為 ON,當第一次參考統計資料時,會更新所有統計資料。更新統計資料可在您執行查詢時,增加選取較佳查詢計劃的可能性。

ms143179.note(zh-tw,SQL.90).gif附註:

在某些情況下,將 AUTO_UPDATE_STATISTICS 設定為 ON 之後,第一次參考統計資料時,更新統計資料的處理序會影響查詢的效能。

若要將 AUTO_UPDATE_STATISTICS 資料庫 SET 選項設定為 ON,請使用 ALTER DATABASE 陳述式;或者,若要在資料庫中更新統計資料,請執行 sp_updatestats

[最大伺服器記憶體] 選項

在 SQL Server 2000 中,如果系統實體記憶體可用,SQL Server 緩衝集區可超過 [最大伺服器記憶體] 選項指定的限制。在 SQL Server 2005 中,緩衝集區不得超過 [最大伺服器記憶體] 的值。達到這項限制時,查詢失敗,並出現「系統記憶體不足」錯誤。

如果您收到這則錯誤訊息,且已設定 [最大伺服器記憶體] 選項,請增加選項的值,或將這個值重設為預設值 2147483647。如需詳細資訊,請參閱<伺服器記憶體選項>。

[查詢管理員成本限制] 選項

套用 sp_configure 的 SET GOVERNOR_QUERY_COST_LIMIT 或 [查詢管理者成本限制] 選項會造成在舊版 SQL Server 中執行的查詢不能在 SQL Server 2005 中執行。這個行為是因為查詢成本模型化變更而發生。

將連接或伺服器執行個體的查詢管理員成本限制設定更新為適當的值,或將這個值設定為 0,以指定不限制查詢可執行的期間。

資料庫、資料和記錄檔

功能 描述

壓縮磁碟機

SQL Server 2005 無法在壓縮磁碟機上建立或升級資料庫。當您安裝 SQL Server 2005 時,請為系統資料庫選取未壓縮磁碟機,並確認要升級的資料庫不在壓縮磁碟機上。不過請注意,在資料庫升級之後,您可以在 NTFS 壓縮檔案系統上放置唯讀資料庫和唯讀次要檔案群組。

資料檔

資料檔需要其他磁碟空間來處理下列變更:

  • 其他系統中繼資料是針對資料庫物件和使用者權限,在每一個使用者資料庫的 PRIMARY 檔案群組中建立及維護。例如,在舊版的 SQL Server 中,與同意授權者或被授與者相關聯的權限是以點陣圖儲存在單一資料列中。在 SQL Server 2005 中,點陣圖已擴充為多個資料列。
  • 定義為 textntextimage 資料類型的大型物件 (LOB) 資料行需要每一個資料行有額外 40 個位元組的磁碟空間。這個單次空間的增加是在每一個 LOB 資料行第一次更新期間發生的。
  • 全文檢索文件識別碼 (DOCID) 對應儲存在資料檔中,而不是在全文檢索目錄中。

若要確定資源可在升級和後續實際執行期間處理大小的增加,建議您在升級到 SQL Server 2005 之前,將所有使用者資料檔的自動成長設成 ON。在升級及測試工作負載之後,可將自動成長設成 OFF,或據此調整 FILEGROWTH 遞增。如需詳細資訊,請參閱<ALTER DATABASE (Transact-SQL)>。

資料庫相容性模式

當資料庫從任何舊版 SQL Server 升級到 SQL Server 2005 時,資料庫會保留其現有的相容性層級。如果您在升級之後,將相容性模式變更為 90,則相容性模式的差異將影響應用程式。如需有關這些差異的詳細資訊,請參閱<sp_dbcmptlevel (Transact-SQL)>。

資料庫識別碼 32767

在 SQL Server 2005 中,已保留這個資料庫識別碼。升級之前,請先卸離資料庫。

檔案群組

在升級到 SQL Server 2005 之前,SQL Server 執行個體中所有資料庫的檔案群組必須設定為 READ_WRITE。若要將檔案群組設定為 READ_WRITE,請使用 ALTER DATABASE

記錄檔

在 SQL Server 2005 中,交易記錄檔需要其他磁碟空間。在損毀復原的恢復階段,SQL Server 2005 可讓使用者存取資料庫。因為發生損毀時未認可的交易會重新取得損毀之前已保留的任何鎖定,所以這是可能發生的。當交易回復時,其鎖定有助於保護它們不受使用者干預。這個額外鎖定資訊必須在交易記錄中維護。

若要確定資源可在升級和後續實際執行期間處理大小的增加,建議您在升級到 SQL Server 2005 之前,將所有使用者記錄檔的自動成長設成 ON。在升級及測試工作負載之後,可將自動成長設成 OFF,或據此調整 FILEGROWTH 遞增。如需詳細資訊,請參閱<ALTER DATABASE (Transact-SQL)>。

model 資料庫

在 SQL Server 2005 中,model 資料庫包含下列變更:

  • 較大的大小下限。
  • 相容性層級設定為 90。
  • PAGE_VERIFY 資料庫選項設定為 CHECKSUM。

tempdb 資料庫

SQL Server 2005 中的 tempdb 資料檔和記錄檔需要其他磁碟空間。若要確定資源可在升級和後續實際執行期間處理大小的增加,建議您在升級到 SQL Server 2005 之前,將所有 tempdb 資料檔和記錄檔的自動成長設成 ON。在升級及測試工作負載之後,可將自動成長設成 OFF,或據此調整 FILEGROWTH 遞增。

如需詳細資訊,請參閱<tempdb 磁碟空間不足的疑難排解>。

功能

功能

描述

擴充預存程序

在升級到 SQL Server 2005 之後,先前註冊時不含 DLL 名稱之完整路徑的擴充預存程序可能無法作用。這是因為在升級處理序期間,舊的 BINN 目錄不會加入新路徑中。SQL Server 可能找不到擴充預存程序。

在升級到 SQL Server 2005 之前,請遵照這些步驟來處理未使用完整路徑名稱註冊的每一個擴充預存程序。

  1. 若要移除擴充預存程序,請執行 sp_dropextendedproc。
  2. 若要以完整路徑名稱註冊擴充預存程序,請執行 sp_addextendedproc。

記錄傳送

舊版的 SQL Server 中的記錄傳送與 SQL Server 2005 中的記錄傳送不相容,無法直接升級。在升級到 SQL Server 2005 之後,請使用 SQL Server Management Studio 或預存程序來重新設定記錄傳送。如需詳細資訊,請參閱<將 SQL Server 2000 記錄傳送組態移轉至 SQL Server 2005>。

osql 公用程式

osql 公用程式不支援 ED!! 命令。請從指令碼中移除 ED!! 命令的參考。若要使用 ED!! 命令,請改用 sqlcmd 公用程式

SQL-DMO WMI 提供者

SQL-DMO WMI 提供者已停止,無法使用。

SQL Mail

SQL Server 支援 SQL Mail 從 SQL Server 7.0 或 SQL Server 2000 升級;不過,SQL Server 2005 需要 Microsoft Outlook 2002 或更新版本做為郵件用戶端。

ms143179.note(zh-tw,SQL.90).gif附註:

未來的 Microsoft SQL Server 發行版本將不再提供此功能。請避免在新的開發工作中使用此功能,並計劃修改目前使用此功能的應用程式。 若要從 SQL Server 2005 傳送郵件,請使用 Database Mail。

SQL Mail

當使用 SQL Server 驗證連接的用戶端嘗試傳送包含附加檔案的 SQL Mail 時,SQL Server 無法設定適當的安全性內容,而傳回錯誤。若要避免這個問題,請使用 Windows 驗證。

SQL 命名空間 API (SQL-NS)

SQL 命名空間 API (SQL-NS) 已停止,無法使用。

追蹤旗標

在 SQL Server 2000 中,在工作階段 A 設定的追蹤旗標,不會在現有的工作階段 B 中自動生效。相反地,只有第一次在工作階段 B 設定追蹤旗標之後,該追蹤旗標才會生效。這個行為在 SQL Server 2000 中不具決定性,在 SQL Server 2005 中具決定性。在 SQL Server 2005 中,在工作階段 A 設定的全域追蹤旗標,會立即在其他並行工作階段中設定。

而且,在 SQL Server 2005 中,可在 DBCC TRACEON 陳述式中使用其他引數,將追蹤旗標指定為本機或全域。如果未指定第二個引數,在 SQL Server 2005 中,預設值為本機。這與 SQL Server 2000 不同,其預設值為全域。

如需詳細資訊,請參閱<追蹤旗標 (Transact-SQL)>。

追蹤旗標

有些 SQL Server 2000 追蹤旗標不存在於 SQL Server 2005 中。而且,有些追蹤旗標在 SQL Server 2005 中有不同功能。在升級到 SQL Server 2005 之前,您應該停用所有追蹤旗標。在升級之後,請確認追蹤旗標的功能不變。並確認在重新啟用任何追蹤旗標之前,追蹤旗標仍然是必要的。

觸發程序

在 SQL Server 2005 中,資料定義語言 (DDL) 陳述式 (例如 CREATE INDEX) 無法在 DML 觸發程序內已插入的和已刪除的資料表中執行。在舊版 SQL Server 中,有些 DDL 陳述式可以在已插入的和已刪除的資料表中執行。如需詳細資訊,請參閱<使用插入和刪除的資料表>。

重複的索引名稱

在 SQL Server 2005 中,不允許重複的資料表或檢視索引名稱。升級之前,請重新命名索引,以移除重複者。

  1. 請執行下列查詢來尋找重複的索引:

    SELECT DISTINCT OBJECT_NAME(o.id), name
    FROM sysindexes as o
    WHERE EXISTS 
        (SELECT name FROM sysindexes  as i
          WHERE i.id = o.id
          AND i.name = o.name and i.indid < o.indid);
    
  2. 使用 sp_rename 來變更其中一個索引名稱。因為索引名稱相同,所以您無法判斷要重新命名的索引。這個步驟可讓您區分索引。

    EXEC sp_rename N'table_name.index_name', N'new_index_name, N'INDEX'
    
  3. 請執行下列查詢確認重新命名的索引。下列查詢傳回所有索引,包括指定的資料表或檢視上的索引鍵資料行名稱:

    SELECT i.name AS IndexName, c.name AS ColumnName, ik.colid, ik.keyno
    FROM sysindexes i
    JOIN sysindexkeys ik ON i.id = ik.id and i.indid = ik.indid 
    JOIN syscolumns c ON c.id = ik.id and ik.colid = c.colid
    WHERE i.id = OBJECT_ID('table_or_view_name')
    
  4. 如果您必須這麼做,請再次使用 sp_rename 來更正索引名稱。

物件名稱

在 SQL Server 2005 中,您不能在物件名稱中使用 0xFFFF 字元。當資料庫在資料庫相容性層級 90 時,無法存取包含這個 Unicode 字元的物件名稱。請重新命名包含這個字元的物件。

資料表變數和資料行定序比對

在 SQL Server 2000 中,資料表變數內定義的資料行會隱含地轉換成 tempdb 資料庫的定序。在 SQL Server 2005 中,資料表變數內定義的資料行會隱含地轉換成目前資料庫的定序。仰賴 SQL Server 2000 行為的查詢可能會傳回非預期的結果,例如傳回資料列的數目或順序不同。

例如,使用 TestDB 資料庫的定序而非 tempdb 定序時,在下列 SELECT 陳述式的 WHERE 子句中,c1c2 資料行的相等比較可能會傳回更少或更多資料列。例如,如果定序不區分大小寫,'Name' 和 'name' 值就會評估為相等;如果定序會區分大小寫,則評估為不相等。

CREATE DATABASE TestDB COLLATE Estonian_CS_AI;
GO
USE TestDB;
DECLARE @TempTable table (c1 varchar(10), c2 varchar(10);
SELECT * FROM @TempTable WHERE c1 = c2;

若要在資料表變數中使用目前資料庫定序以外的定序,請在 DECLARE 陳述式的資料行定義或參考這些資料行的查詢中指定定序。下列範例會顯示這兩種方法。

USE TestDB;
DECLARE @TempTable table (c1 varchar(10)COLLATE Latin1_General_CS_AS, c2 varchar(10)COLLATE Latin1_General_CS_AS);
SELECT * FROM @TempTable WHERE c1 = c2;
GO
-- or

DECLARE @TempTable table (c1 varchar(10), c2 varchar(10));
SELECT * FROM @TempTable WHERE c1 = c2 COLLATE Latin1_General_CS_AS;
GO

索引檢視表

功能 描述

函數決定性

下列函數運算式在 SQL Server 2005 中被視為不具決定性,因此,可能影響索引檢視的建立:

  • 已隱含轉換為 datetimesmalldatetime 的字串常值的參考。
  • 定序之間的非 Unicode 字元資料的隱含轉換。

除非相容性層級設定為 80 或以下,否則,包含字元字串隱含轉換為 datetimesmalldatetime 的運算式,在 SQL Server 2005 中被視為不具決定性。這是因為其結果需視伺服器工作階段的 LANGUAGE 和 DATEFORMAT 設定而定。例如,運算式 CONVERT (datetime, '30 listopad 1996', 113) 的結果需視 LANGUAGE 設定而定,因為字串 'listopad' 在不同語言中表示不同月份。同樣地,在運算式 DATEADD(mm,3,'2000-12-01') 中,SQL Server 會根據 DATEFORMAT 設定解譯字串 '2000-12-01'

除非相容性層級是設定為 80 或舊版,否則非 Unicode 字元資料與定序之間的隱含轉換也是視為非決定性的。

在資料庫相容性層級 90 中,不允許針對包含這些運算式的檢視表建立索引。雖然包含已升級資料庫中的這些運算式的現有檢視表是可以維護的,但查詢最佳化工具在相容性層級 80 或 90 的查詢計畫中不會考慮使用它們。如需有關設定相容性層級的資訊,請參閱<sp_dbcmptlevel (Transact-SQL)>。

在 SQL Server 2005 的索引檢視定義中,您應該使用具決定性的日期格式樣式,明確將常值轉換為慣用日期類型。如需具決定性之日期格式樣式的清單,請參閱<CAST 和 CONVERT (Transact-SQL)>。

如果您在已升級到 SQL Server 2005 的現有索引檢視中使用隱含字串對日期轉換,應該確定 LANGUAGE 和 DATEFORMAT 設定在資料庫和應用程式中是一致的,以避免索引檢視可能的損毀。

IGNORE_DUP_KEY

當您在 SQL Server 2005 的檢視中建立唯一叢集索引時,IGNORE_DUP_KEY 選項必須設定為 OFF。這是預設值。將 IGNORE_DUP_KEY 設定為 ON 可能導致索引檢視損毀。

在檢視上卸除叢集索引並重新建立它,但不要指定 IGNORE_DUP_KEY 選項。

查詢提示

在相容性層級為 80 時,索引檢視表定義中的查詢提示會被忽略。這可能會造成某些應用程式在相容性層級 80 和 90 之間的行為不同。如需詳細資訊,請參閱<設計索引檢視>、<建立索引檢視>和<查詢提示 (Transact-SQL)>。

安全性

功能 描述

登入名稱

下列固定伺服器角色已保留在 SQL Server 2005 中,無法做為使用者自訂登入名稱使用:

  • 系統管理員 (sysadmin)
  • 伺服器管理員 (serveradmin)
  • setupadmin
  • 安全性管理員 (securityadmin)
  • 處理序管理員 (processadmin)
  • 資料庫建立者 (dbcreator)
  • diskadmin
  • bulkadmin

在升級到 SQL Server 2005 之前,請遵照這些步驟:

  1. 執行下列陳述式來記錄登入的安全性識別碼 (SID):

    SELECT name, sid 
    FROM master.dbo.syslogins 
    WHERE name IN('sysadmin', 'serveradmin','setupadmin',
     'securityadmin','processadmin', 'dbcreator','diskadmin',
     'bulkadmin')
  2. 卸除登入。
  3. 若要建立新登入,請使用 sp_addlogin 系統程序。在每一個相對應登入的 @sid 參數中,請指定在步驟 1 傳回的 SID。

登入安全性識別碼 (SID)

在 SQL Server 2005 中,不允許重複安全性識別碼 (SID)。在升級之前,請移除其中一個登入和相關聯的使用者。

遠端登入對應

在舊版的 SQL Server 中,來自 SQL Server 之遠端執行個體的登入,可使用 sp_remoteoption 系統預存程序標示為信任。SQL Server 2005 不支援這個標示遠端登入的方法。在升級到 SQL Server 2005 之後,遠端登入將不再標示為信任。

若要設定和管理遠端登入,請使用連結伺服器和連結伺服器預存程序。如需詳細資訊,請參閱<連結伺服器>。

SQL Server 6.5 登入

SQL Server 6.5 以不再支援的格式儲存密碼雜湊。舊密碼無法直接升級到 SQL Server 2005。

若要啟用這項登入,您必須重設其密碼。您可以使用 ALTER LOGIN 來重設密碼:

ALTER LOGIN <login name> WITH PASSWORD = '<new password>' MUST_CHANGE

除非已停用原則檢查,否則,將依據系統的密碼複雜性原則驗證新密碼。建議您使用複雜密碼,而且不停用原則檢查。MUST_CHANGE 選項強迫使用者選取新密碼。這不是必要的,但建議您這麼做。

您可以使用下列查詢來識別休眠 SQL Server 6.5 登入:

SELECT * FROM sysxlogins WHERE (xstatus & 2048) = 2048;
GO

sys 使用者名稱

sys 名稱已保留在 SQL Server 2005 中,無法當做使用者名稱使用。在升級到 SQL Server 2005 之前,請重新命名使用者。如果使用者未重新命名,在升級處理序之後,資料庫將處於質疑狀態下,要等到資料庫連線時才可供使用。

升級前程序

在升級到 SQL Server 2005 之前,請在包含 sys 使用者的每一個資料庫中執行下列動作:

  1. 建立新的使用者。
  2. 使用下列陳述式來顯示由 sys 使用者所授與及授與給 sys 使用者的所有權限。

    -- Return permissions granted by user sys.
    SELECT * FROM sysprotects WHERE grantor = USER_ID('sys')
    -- Return permissions granted to user sys.
    SELECT * FROM sysprotects WHERE uid = USER_ID('sys')
  3. 若要將 sys 擁有之所有物件的擁有權傳送至新使用者,請使用 sp_changeobjectowner。
  4. 卸除 sys 使用者。
  5. 若要還原在步驟 2 擷取的原始權限,請使用 GRANT 陳述式的 AS new_user 子句。
  6. 修改指令碼以參考新使用者。

升級後程序

如果在升級之前未重新命名 sys 使用者,請執行下列動作:

  1. 執行陳述式 ALTER DATABASE db_name SET ONLINE。資料庫將在 SINGLE_USER 模式中。
  2. 遵照「升級前程序」一節中的所有步驟。
  3. 執行陳述式 ALTER DATABASE db_name SET MULTI_USER

系統物件和中繼資料

功能 描述

INFORMATION_SCHEMA.COLUMNS

在 SQL Server 2005 中,INFORMATION_SCHEMA.COLUMNS 檢視表的 ORDINAL_POSITION 資料行與 COLUMNS_UPDATED 函數傳回的位元模式不相容。

若要取得與 COLUMNS_UPDATED 相容的位元模式,在您查詢 INFORMATION_SCHEMA.COLUMNS 檢視時,請參考 COLUMNPROPERTY 系統函數的 ColumnID 屬性,如下列範例所示:

SELECT TABLE_NAME, COLUMN_NAME,
    COLUMNPROPERTY(OBJECT_ID(TABLE_SCHEMA + '.' + TABLE_NAME),
    COLUMN_NAME, 'ColumnID') AS COLUMN_ID
FROM AdventureWorks.INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'Contact';

INFORMATION_SCHEMA.SCHEMATA

在舊版 SQL Server 中,INFORMATION_SCHEMA.SCHEMATA 檢視表會傳回 SQL Server 執行個體中的所有資料庫。在 SQL Server 2005 中,檢視傳回資料庫的所有結構描述。這個行為符合 SQL 標準。如需詳細資訊,請參閱<SCHEMATA (Transact-SQL)>。

符合 '%SCHEMA' 值的 INFORMATION_SCHEMA 資料行名稱

在舊版 SQL Server 中,符合 '%SCHEMA' 值的 INFORMATION_SCHEMA 資料行名稱會傳回使用者的名稱。在 SQL Server 2005 中,這些資料行傳回結構描述名稱。當資料庫升級到 SQL Server 2005 後,結構描述名稱一律與使用者名稱相同,且參考這些資料行的應用程式不會失敗。不過,在其資料庫中實作 SQL Server 2005 使用者結構描述分隔功能的使用者應該了解,如果預期的資料是使用者名稱而不是結構描述名稱,則其應用程式會失敗。

如需詳細資訊,請參閱<使用者結構描述分隔>。

sp_helptrigger

SQL Server 2005 加入 trigger_schema,當做 sp_helptrigger 系統預存程序傳回之結果集的最後一個資料行。請檢閱 sp_helptrigger 在應用程式中的使用方式。您可能必須修改應用程式來處理其他資料行。另外,您可以使用 sys.triggers 目錄檢視。

syslockinfo 和 sp_lock

在 SQL Server 2000 中,syslockinfo 中的 rsc_objid 和 rsc_indid 資料行以及 sp_lock 中的 objid 和 indid 資料行會一致傳回物件識別碼和索引識別碼。在 SQL Server 2005 中,可能會傳回 0 值。

在 SQL Server 2000 中,syslockinfo 和 sp_lock 對單一交易中的任何特定鎖定資源最多會傳回兩個資料列。在 SQL Server 2005 中,啟用鎖定資料分割之後,對在一個交易下執行的相同資源可傳回多個資料列。最多可傳回 N + 1 個資料列,其中 N 是 CPU 的數目。此外,在 SQL Server 2005 中,可對相同資源顯示 GRANTED 和 WAITING 要求;在 SQL Server 2000 中,無法對相同資源顯示這些要求。如需詳細資訊,請參閱<sp_lock (Transact-SQL)>和<sys.syslockinfo (Transact-SQL)>。

系統物件名稱和系統類型名稱定序比對

在舊版 SQL Server 中,系統物件和系統類型名稱將比對 master 資料庫的定序。在 SQL Server 2005 中,系統物件名稱和系統類型名稱會自動轉換,以對應目前資料庫的定序。如果這些物件在指令碼或應用程式中的參考不符合它們在目錄中的呈現方式,且目前資料庫具有區分大小寫的定序,則指令碼或應用程式可能會失敗。例如,如果目前資料庫含有區分大小寫的定序,則 EXEC SP_heLP 陳述式將會失敗。

系統物件修改

SQL Server 2005 不允許直接系統目錄更新。嘗試這麼做將產生下列錯誤:

"Server: Msg 259, Level 16, State 1, Line 1"

"Ad hoc updates to system catalogs are not allowed."

請修改 SQL 指令碼,以使用正式記載的 API。例如,使用 ALTER DATABASE database_name SET EMERGENCY,而不要在 sysdatabases 系統資料表上執行 UPDATE 陳述式。

系統物件移除

無法使用 DROP TABLE、DROP PROCEDURE 和 sp_dropextendedproc 之類的陳述式來移除系統物件,因為這些物件會部署在唯讀資源資料庫中。

移除試圖從應用程式卸除系統物件的所有陳述式。修改應用程式,以撤銷或拒絕系統物件的 EXECUTE 權限。另外,您也可以使用 SQL Server 2005 中的其中一個介面區組態工具來停用一些物件。例如,可使用其中一個介面區組態工具來停用或啟用 xp_cmdshell 擴充預存程序。

sysperfinfo

在 SQL Server 2005 中,sysperfinfo 對 cntr_value 資料行會傳回 bigint 值。請修改使用 sysperfinfo 的應用程式,以確定它們可以處理 cntr_value 資料行的 bigint 值。

在 SQL Server 2005 中,sysperfinfo 是一份相容性檢視表。您應該改用 sys.dm_os_performance_counters 動態管理檢視。

系統資料表是利用搜尋準則中的 'dbo' 來查詢

在舊版 SQL Server 中,系統物件由 dbo 擁有,並位於 master 資料庫中。在 SQL Server 2005 中,系統物件由 sys 擁有,並以邏輯方式出現在每一個資料庫中。查詢系統資料表並具有指定 dbo 使用者搜尋準則的陳述式將會失敗。

Transact-SQL

功能 描述

@@VERSION

SQL Server 2005 以 major.minor.build.incremental-build 格式,傳回比 SQL Server 2000 更詳細的資訊。

CREATE STATISTICS

在 SQL Server 2005 中,不支援在 CREATE STATISTICS 陳述式中指定 WITH ROWS。請修改包含 WITH ROWS 的 CREATE STATISTICS 陳述式,方法是在 WITH 和 ROWS 之間指定 SAMPLE number,或指定符合所記載語法的其他選項。

DISK INIT

在舊版的 SQL Server 中,用來建立資料庫或交易記錄裝置的 DISK INIT 陳述式已從 SQL Server 2005 中移除。所有出現這個陳述式的地方,均以相等的 CREATE DATABASE 或 ALTER DATABASE 陳述式取代。

UNION 位於 INSERT INTO...SELECT 陳述式內

當 UNION 運算子位於 INSERT 陳述式內,SQL Server 2005 會根據資料類型轉換規則,獨立轉換每一個 UNION 作業的資料類型。然後,UNION 作業的最終結果的資料類型會轉換成 INSERT 作業的目標資料表的對應資料行。這個行為上的變更會導致應用程式發生資料類型轉換錯誤。

下列範例示範資料類型轉換錯誤。在 80 和以下的相容性層級中,第一個 SELECT 陳述式中的整數常數 1 會直接轉換成目的地資料行 ReturnedValue 的資料類型,即 varchar(255)。在相容性層級 90 中,在轉換成目的地資料行之前已決定 UNION 結果集的資料類型。對於第一個 SELECT 陳述式的第二個資料行,已決定資料類型為 int。對於第二個 SELECT 陳述式的第二個資料行,已決定資料類型為 varchar(4)。因為 int 資料類型的優先順序高於 varchar(4) 資料類型,所以,在決定 UNION 結果集的資料類型之後,test 值將轉換為 int 資料類型,而造成資料類型轉換錯誤。

CREATE TABLE #test(ReturnedName varchar(255) NOT NULL,
  ReturnedValue varchar(255) NULL)
INSERT INTO #test 
SELECT 'col1', 1
UNION ALL
SELECT 'test', 'test'
DROP TABLE #test

UPDATETEXT

SQL Server 2005 不支援在 UPDATETEXT 陳述式中使用文字指標,利用相同文字指標來讀取及寫入相同二進位大型物件 (BLOB)。將 BLOB 複製到暫存資料表或資料表變數,然後將這個值重新指派至原始資料行。

使用資料表提示時的 WITH 關鍵字

在 SQL Server 2005 中,唯有利用 WITH 關鍵字指定提示時,查詢的 FROM 子句中才支援資料表提示,但有些例外狀況。

如需詳細資訊,請參閱<FROM (Transact-SQL)>和<資料表提示 (Transact-SQL)>。

檢視定義中的 ORDER BY

在 SQL Server 2005 中,檢視定義中的 ORDER BY 子句只能用來判定 TOP 子句在檢視定義中傳回的資料列。除非同時在查詢本身指定 ORDER BY 子句,否則 ORDER BY 子句並不保證查詢檢視時會傳回排序的結果。

具有鎖定提示的 UPDATE

在 SQL Server 2000 中,當下列兩項條件都成立時,不會檢查 UPDATE 陳述式中是否發生鎖定提示衝突:

  • FROM 子句中的資料表具有別名。
  • 此資料表為 UPDATE 陳述式的參考目標,並且不具有別名。

SQL Server 會忽略 FROM 子句提供的鎖定提示,而且提示產生衝突時不會發出錯誤。但是在 SQL Server 2005 中,如果鎖定提示在這些條件下產生衝突,就會傳回錯誤。

XML

功能 描述

OPENXML

因為 MSXML 已變更,OPENXML 不再支援非整數位置述詞。在 SQL Server 2005 中,MSXML 3.0 是基礎引擎,用來處理在 OPENXML 查詢內使用的 XPath 運算式。MSXML 3.0 有更一致的 XPath 1.0 引擎,其中位置述詞中的非整數值語意已變更。

例如,下列 XPath 運算式 a[5.1] 將不傳回其他元素,而非第 5 個 <a> 元素。若要更正這個情況,請直接使用捨入值。例如,將上一個範例修改為 a[5]

OPENXML XPath 運算式

MSXML 3.0 有更嚴格的 XPath 1.0 引擎,其中已移除下列函數的支援:

  • format-number()
  • formatNumber()
  • current()
  • element-available()
  • function-available()
  • system-property()

若為 format-number() 和 formatNumber(),您可以使用 Transact-SQL。其他不支援的函數,並無直接解決之道。

使用者自訂類型 'xml'

在 SQL Server 2005 中,xml 是一種保留的系統類型。在升級之前或之後,使用 sp_rename 來重新命名類型,並修改應用程式來使用新的類型名稱。

請參閱

參考

SQL Server 2005 中對於 Database Engine 功能的行為變更
SQL Server 2005 中已被取代的 Database Engine 功能
SQL Server 2005 中已停止的 Database Engine 功能

其他資源

SQL Server 2005 Database Engine 回溯相容性
sp_dbcmptlevel (Transact-SQL)

說明及資訊

取得 SQL Server 2005 協助

變更歷程記錄

版本 歷程記錄

2008 年 11 月 17 日

新增內容:
  • 在「功能」一節底下,新增有關在資料表變數中比對資料行定序的項目。

2006 年 4 月 14 日

新增內容:
  • 在 Transact-SQL 一節底下,新增有關在檢視表定義中使用 ORDER BY 的項目。
  • 在「Transact-SQL」一節下,新增一個有關搭配 UPDATE 使用鎖定提示的項目。