SQL Server 2005将某些数据库行为设置为与指定的 SQL Server 版本兼容
語法
sp_dbcmptlevel [ [ @dbname = ] name ] [ , [ @new_cmptlevel = ] version ]參數(shù)
[?@dbname?=?]?name要為其更改兼容級別的數(shù)據(jù)庫的名稱。數(shù)據(jù)庫名稱必須符合標(biāo)識符的規(guī)則。name?的數(shù)據(jù)類型為?sysname,默認(rèn)值為 NULL。
數(shù)據(jù)庫要與之兼容的 SQL Server 的版本。version?的數(shù)據(jù)類型為?tinyint,默認(rèn)值為 NULL。該值必須為下列值之一:
60?= SQL Server 6.0
65?= SQL Server 6.5
70?= SQL Server 7.0
80?= SQL Server 2000
90?= SQL Server 2005
| 不推薦使用值?60?和?65,以后的版本中將刪除這兩個值。
|
| SQL Server Management Studio 和 SQL Server 管理對象 (SMO) 不支持兼容級別 60。如果將 SMO 或 Management Studio 用于兼容級別設(shè)置為 60 的數(shù)據(jù)庫,則執(zhí)行某些操作時會產(chǎn)生錯誤。
|
返回代碼值
0(成功)或 1(失敗)
結(jié)果集
如果未指定任何參數(shù)或未指定?name?參數(shù),則?sp_dbcmptlevel?將返回錯誤。
如果指定?name?但未指定?version,則 SQL Server 2005 數(shù)據(jù)庫引擎將返回一條消息,顯示指定數(shù)據(jù)庫的當(dāng)前兼容級別。
備注
對于所有 SQL Server 2005 安裝,默認(rèn)的兼容級別都為 90。除非?model?數(shù)據(jù)庫有更低的兼容級別,否則 SQL Server 2005 中創(chuàng)建的數(shù)據(jù)庫會設(shè)置為該級別。在將數(shù)據(jù)庫從 SQL Server 的任何早期版本升級到 SQL Server 2005 之后,該數(shù)據(jù)庫將保留其現(xiàn)有的兼容級別。這既適用于系統(tǒng)數(shù)據(jù)庫也適用于用戶數(shù)據(jù)庫。可使用?sp_dbcmptlevel?將數(shù)據(jù)庫的兼容級別更改為 90。若要查看數(shù)據(jù)庫的當(dāng)前兼容級別,請查詢?sys.databases?目錄視圖中的?compatibility_level?列。
使用 sp_dbcmptlevel 以獲得向后兼容性
sp_dbcmptlevel?存儲過程只影響指定數(shù)據(jù)庫的行為,而不影響整個服務(wù)器的行為。sp_dbcmptlevel?只提供與 SQL Server 的早期版本的部分向后兼容性。將sp_dbcmptlevel?用作中間遷移助手,可解決相關(guān)兼容級別設(shè)置所控制的行為之間存在的版本差異問題。如果現(xiàn)有 SQL Server 應(yīng)用程序受到 SQL Server 2005 中行為差異的影響,請對該應(yīng)用程序進(jìn)行轉(zhuǎn)換,使之能正常運行。然后使用?sp_dbcmptlevel?將兼容級別更改為 90。數(shù)據(jù)庫的新兼容性設(shè)置將在該數(shù)據(jù)庫下次成為當(dāng)前數(shù)據(jù)庫(無論是在登錄時作為默認(rèn)數(shù)據(jù)庫還是在 USE 語句中指定)時生效。
包含索引視圖的數(shù)據(jù)庫的兼容級別不能更改為低于 80。
最佳實踐
如果在用戶連接到數(shù)據(jù)庫時更改兼容級別,可能會使活動查詢產(chǎn)生不正確的結(jié)果集。例如,如果在編寫查詢計劃時兼容級別發(fā)生更改,則編寫后的計劃可能同時基于舊的和新的兼容級別,從而造成計劃不正確,并可能導(dǎo)致結(jié)果不準(zhǔn)確。此外,如果將計劃放在計劃緩存中供后續(xù)的查詢重用,則問題可能更加復(fù)雜。為了避免查詢結(jié)果不準(zhǔn)確,建議您使用以下過程來更改數(shù)據(jù)庫的兼容級別:
SET 選項
新功能可以在舊的兼容級別下正常運行,但是可能需要調(diào)整 SET 選項。例如,在兼容級別 80 下使用?xml?數(shù)據(jù)類型需要相應(yīng)的 ANSI SET 選項。而且,數(shù)據(jù)庫兼容級別設(shè)置為 90 時,如果將 ANSI_WARNINGS 設(shè)置為 ON,將使 ARITHABORT 隱式設(shè)置為 ON。如果將數(shù)據(jù)庫兼容級別設(shè)置為 80 或更低,則必須將 ARITHABORT 選項顯式設(shè)置為 ON。有關(guān)詳細(xì)信息,請參閱影響結(jié)果的 SET 選項。
兼容級別和存儲過程
執(zhí)行某一存儲過程時,該存儲過程將使用定義它的數(shù)據(jù)庫的當(dāng)前兼容級別。在更改某一數(shù)據(jù)庫的兼容性設(shè)置時,該數(shù)據(jù)庫的所有存儲過程都將隨之自動重新編寫。
有關(guān)使用 sp_dbcmptlevel 的環(huán)境方面的注意事項
每個?sp_dbcmptlevel?調(diào)用都必須單獨提交。sp_dbcmptlevel?不能使用其他上下文中的調(diào)用,例如:
- 存儲過程。
- 用 EXEC(string) 語法執(zhí)行的 Transact-SQL 字符串。
- Transact-SQL 語句的批處理。
級別 60 或 65 與級別 70、80 或 90 之間的差異
將兼容級別設(shè)置為 60 或 65 將會影響許多行為。其中包括下表中左邊的列所列出的行為。
| 有關(guān)影響 6.x?應(yīng)用程序的其他差異,請參閱本主題后面的“較低兼容級別和級別 90 之間的差異”以及“備注”部分中的 6.x?后版本的保留關(guān)鍵字。
|
| 帶 GROUP BY 子句但不帶 ORDER BY 子句的 SELECT 語句的結(jié)果集,將按 GROUP BY 列排序。 | GROUP BY 子句本身沒有排序功能。必須顯式指定 ORDER BY 子句,SQL Server 才能對任意結(jié)果集進(jìn)行排序。有關(guān)詳細(xì)信息,請參閱?SELECT (Transact-SQL)。 |
| UPDATE 語句的 SET 子句接受以表的別名作為前綴的列。 | 在 UPDATE 語句的 SET 子句中,不接受表的別名。在 SET 子句中指定的表或視圖必須與指定的緊跟在 UPDATE 關(guān)鍵字后的表或視圖相匹配。有關(guān)詳細(xì)信息,請參閱?UPDATE (Transact-SQL)。 |
| 在創(chuàng)建?bit?列時,如果在 CREATE TABLE 或 ALTER TABLE 中沒有顯式地指定 NULL 或 NOT NULL 選項,則該列將按 NOT NULL 創(chuàng)建。 | 如果沒有顯式地指定,則?bit?列的為空性由 SET ANSI_NULL_DFLT_ON/SET ANSI_NULL_DFLT_OFF 的會話設(shè)置決定,或者由 SET ANSI NULL DEFAULT 的數(shù)據(jù)庫設(shè)置決定。有關(guān)詳細(xì)信息,請參閱?SET (Transact-SQL)。 |
| ALTER COLUMN 子句無法在 ALTER TABLE 上使用。 | ALTER COLUMN 子句可在 ALTER TABLE 上使用。有關(guān)詳細(xì)信息,請參閱?ALTER TABLE (Transact-SQL)。 |
| 為表創(chuàng)建的觸發(fā)器將替換同一類型的任何現(xiàn)有觸發(fā)器 (INSERT、UPDATE、DELETE)。可以使用 CREATE TRIGGER 的 WITH APPEND 選項創(chuàng)建同一類型的多個觸發(fā)器。 | 可以附加相同類型的觸發(fā)器。觸發(fā)器的名稱必須唯一。假定已經(jīng)使用了 WITH APPEND 選項。有關(guān)詳細(xì)信息,請參閱?CREATE TRIGGER (Transact-SQL)。 |
| 如果批處理或過程包含無效的對象名,則當(dāng)分析或編寫批處理時,將返回警告消息,并且在執(zhí)行批處理時,將返回錯誤信息。 | 對于本地?zé)o效對象,在分析或編寫批處理時,將不返回警告,但在執(zhí)行批處理時,將返回錯誤信息。 但對于遠(yuǎn)程無效對象,不支持延遲名稱解析 (DNR);如果在某一過程中使用無效的遠(yuǎn)程表,則該過程的創(chuàng)建將失敗,并返回錯誤。 DNR 支持(在編寫期間,引用執(zhí)行之前均不存在的對象的功能)只適用于表或視圖名稱。有關(guān)延遲名稱解析的詳細(xì)信息,請參閱CREATE PROCEDURE (Transact-SQL)。
|
| 通過忽略表?Y?并將?SELECT?語句結(jié)果插入表?X,以下形式的查詢可以正確執(zhí)行。 INSERT X SELECT select_list INTO Y | Microsoft SQL Server 7.0 或更高版本在執(zhí)行同一查詢時,將返回語法錯誤。 |
| 空字符串文字 (' ') 將解釋為一個空格。 | 空字符串文字 (' ') 將解釋為空字符串。 |
| DATALENGTH('') 返回 1(將 '' 分析為一個空格)。 DATALENGTH(N'') 返回 2(將 N'' 分析為一個 Unicode 空格)。 | DATALENGTH('') 返回 0。 DATALENGTH(N'') 返回 0。 |
| LEFT('123', 0) 返回 NULL。 LEFT(N'123', 0) 返回 NULL。 | LEFT('123', 0) 返回空字符串。 LEFT(N'123', 0) 返回空字符串。 |
| LTRIM(' ') 返回 NULL。 LTRIM(N' ') 返回 NULL。 | LTRIM(' ') 返回空字符串。 LTRIM(N' ') 返回空字符串。 |
| REPLICATE('123', 0) 返回 NULL。 REPLICATE(N'123', 0) 返回 NULL。 | REPLICATE('123', 0) 返回空字符串。 REPLICATE(N'123', 0) 返回空字符串。 |
| RIGHT(N'123', 0) 返回 NULL。RIGHT('123', 0) 返回 NULL。 當(dāng)?integer_expression?為負(fù)時,RIGHT('123',?integer_expression) 返回 NULL。 當(dāng)?integer_expression?為負(fù)時,RIGHT(N'123',?integer_expression) 返回 NULL。 | RIGHT('123', 0) 返回空字符串。 RIGHT(N'123', 0) 返回空字符串。 當(dāng)?integer_expression?為負(fù)時,RIGHT('123',?integer_expression) 返回錯誤。當(dāng)integer_expression?為負(fù)時,RIGHT(N'123',?integer_expression) 返回錯誤。 |
| RTRIM(' ') 返回 NULL。 RTRIM(N' ') 返回 NULL。 | RTRIM(' ') 返回空字符串。 RTRIM(N' ') 返回空字符串。 |
| SPACE(0) 返回 NULL。 | SPACE(0) 返回空字符串。 |
| 如果指定的?start?值大于?expression?中的字符數(shù),或者?length?等于 0,則函數(shù) SUBSTRING(expression,?start,?length) 返回 NULL;例如,SUBSTRING(N'123', 4, 1) 返回 NULL。 | 在相同的條件下,SUBSTRING(expression,?start,?length) 返回一個由一對單引號分隔的空字符串;例如,SUBSTRING(N'123', 4, 1) 返回 ''。 |
| UPDATETEXT?table.textcolumn textpointer?0 NULL NULL 將產(chǎn)生空值。 | UPDATETEXT?table.textcolumn textpointer?0 NULL NULL 將產(chǎn)生空文本。 |
| 僅當(dāng)模式和表達(dá)式同時為 NULL 時,CHARINDEX 和 PATINDEX 函數(shù)才返回 NULL。 | 當(dāng)任何輸入?yún)?shù)為 NULL 時,CHARINDEX 和 PATINDEX 函數(shù)將返回 NULL。 |
| 對?inserted?和?deleted?表中的?text?或?image?列的引用顯示為 NULL。 | 不允許引用?inserted?和?deleted?表中的?text?或?image?列。 |
| 如果從觸發(fā)器內(nèi)的?inserted?或?deleted?表中檢索?text?或?image?列,則將對?text?或?image?列返回 NULL 值。 | 不允許從觸發(fā)器內(nèi)的?inserted?或?deleted?表中檢索?text?或?image?列,否則將出現(xiàn)錯誤。 |
| 允許 UPDATETEXT 將?text?列初始化為 NULL。 | UPDATETEXT 將?text?列初始化為空字符串。 WRITETEXT 將?text?列初始化為 NULL。 |
| 如果?sp_dboption?的?concatenation of null yields null?設(shè)置處于關(guān)閉狀態(tài)(禁用),則當(dāng)串聯(lián)操作中的任何操作數(shù)為 NULL 時將返回空字符串。 | 如果?sp_dboption?的?concatenation of null yields null?設(shè)置處于打開狀態(tài)(啟用),則當(dāng)串聯(lián)操作中的任何操作數(shù)為空時將返回 NULL。 |
| 在 INSERT 語句中,允許在 VALUES 子句中使用可以返回標(biāo)量值的 SELECT 語句。 | INSERT 語句不能在 VALUES 子句中將 SELECT 語句用作插入值之一。 |
| 由 INSERT?table?EXEC?procedure?語句引用的存儲過程中的 ROLLBACK 語句將導(dǎo)致 INSERT 語句回滾,但批處理繼續(xù)執(zhí)行。 | 由 INSERT...EXEC 語句引用的存儲過程中的 ROLLBACK 語句將導(dǎo)致整個事務(wù)回滾,并使批處理終止執(zhí)行。 |
較低兼容級別和級別 90 之間的差異
本小節(jié)介紹隨兼容級別 90 引入的新行為。有關(guān)影響兼容級別 80 與較低兼容級別的其他行為差異,請參閱本節(jié)后面的“保留關(guān)鍵字”部分。
使用兼容級別 90 時,行為將發(fā)生下列變化。
| 對于 FROM 子句中的鎖提示,WITH 關(guān)鍵字始終是可選的。 | 也存在一些例外情況:僅當(dāng)用 WITH 關(guān)鍵字指定提示時,才支持在 FROM 子句中使用這些提示。有關(guān)詳細(xì)信息,請參閱?FROM (Transact-SQL)。 | 高 |
| 支持在警告消息中使用外部聯(lián)接運算符 *= 和 =*。 | 不支持使用這兩個運算符;應(yīng)使用 OUTER JOIN 關(guān)鍵字。 | 高 |
| 在將 ORDER BY 列表中的列引用綁定到在 SELECT 列表中定義的列時,將忽略列的多義性,有時還會忽略列前綴。這可以導(dǎo)致以意外順序返回結(jié)果集。 例如,可以接受具有一個兩部分列 (<table_alias>.<column>) 的 ORDER BY 子句,而且該列被用作對 SELECT 列表中的列的引用,但忽略表別名。請考慮下面的查詢。 SELECT c1 = -c1 FROM t_table AS x ORDER BY x.c1 執(zhí)行時,將忽略 ORDER BY 中的列前綴。排序操作對指定的源列 (x.c1) 不按預(yù)期方式執(zhí)行,而是對在查詢中定義的派生?c1?列執(zhí)行。此查詢的執(zhí)行計劃將顯示:首先計算派生列的值,然后對計算得到的值進(jìn)行排序。 | 如果存在列的多義性,則將引發(fā)錯誤。在綁定到 SELECT 列表中所定義的列時,不忽略在 ORDER BY 中指定的列前綴(如果有)。 請考慮下面的查詢。 SELECT c1 = -c1 FROM t_table AS x ORDER BY x.c1 執(zhí)行時,不忽略 ORDER BY 子句中的列前綴。排序操作對指定的源列 (x.c1) 按預(yù)期方式執(zhí)行。此查詢的執(zhí)行計劃將顯示排序運算符對從?t_table?返回的行排序,然后再對在 SELECT 列表中定義的派生列c1?的值排序。 | 中 |
| 在 INSERT SELECT 中,如果 UNION 屬于不同的數(shù)據(jù)類型,則每個 UNION 分支都直接轉(zhuǎn)換為 INSERT 目標(biāo)列的類型。即使本身所使用的聯(lián)合可能會因不兼容的類型轉(zhuǎn)換而失敗,INSERT SELECT 也會使 UNION 成功執(zhí)行,因為 UNION 的結(jié)果類型的分支從不進(jìn)行轉(zhuǎn)換。 | 在 SQL Server 2005 中,UNION 的結(jié)果類型獨立于 INSERT SELECT 而派生。UNION 的每一分支都轉(zhuǎn)換為 UNION 的結(jié)果類型,然后轉(zhuǎn)換為 INSERT 的目標(biāo)列類型。如果 UNION 中有不兼容類型,則第一個轉(zhuǎn)換可能會導(dǎo)致錯誤。若要以兼容級別 90 運行,則必須修復(fù)在 INSERT SELECT 中使用的所有不兼容類型的聯(lián)合。 | 中 |
| 當(dāng)視圖或被引用視圖使用 TOP 子句時,指定了 WITH CHECK OPTION 子句的視圖中無法正確支持通過視圖進(jìn)行插入和更新操作。 | 當(dāng)視圖或被引用視圖使用 TOP 子句時,使用 WITH CHECK OPTION 的視圖中不支持通過視圖進(jìn)行插入和更新操作。 | 中 |
| 可變長度列和固定長度列的 UNION 將生成一個固定長度列。 | 可變長度列和固定長度列的 UNION 將生成一個可變長度列。 | 中 |
| 允許在觸發(fā)器中使用 SET XACT_ABORT OFF。 | 不允許在觸發(fā)器中使用 SET XACT_ABORT OFF。 | 中 |
| 允許在視圖中使用(并忽略)FOR BROWSE 子句。 | 不允許在視圖中使用 FOR BROWSE 子句。 | 中 |
| ANSI_WARNINGS 不控制域錯誤。如果 ANSI_WARNINGS 設(shè)置為 OFF 并且 ARITHABORT 沒有更改,則遵守 ARITHABORT 設(shè)置。 | 域錯誤由 ANSI_WARNINGS 控制,并且是嚴(yán)重級別為 16 的錯誤。如果 ANSI_WARNINGS 或 ARITHABORT 為 ON,則將引發(fā)錯誤,而不是返回 NULL 值。此更改可能會破壞依賴于設(shè)置為 OFF 的 ARITHABORT 的用戶腳本。 | 中 |
| 如果對遠(yuǎn)程數(shù)據(jù)源(OpenRowset?或?OpenQuery)所執(zhí)行的直接傳遞查詢生成名稱重復(fù)的列,則除非在該查詢中顯式命名了這些列,否則將忽略重復(fù)的列名。 | 如果對遠(yuǎn)程數(shù)據(jù)源(OpenRowset?或?OpenQuery)所執(zhí)行的直接傳遞查詢生成列名重復(fù)的列,將引發(fā)錯誤。 | 低 |
| 大小大于 8000 的字符串常量和?varbinary?常量被視為?text、ntext?或?image。 | 大小大于 8000 的字符串常量和?varbinary?常量被視為varchar(max)?類型(或分別被視為?nvarchar(max)?和varbinary(max))。如果 SELECT 列表包含此類表達(dá)式,則這樣可以更改使用 SELECT … INTO 創(chuàng)建的表的數(shù)據(jù)類型。 | 低 |
| 通過將類型層次結(jié)構(gòu)中優(yōu)先級較低的比較數(shù)轉(zhuǎn)換為優(yōu)先級較高的類型,從而在各數(shù)值類型(smallint、tinyint、int、bigint、numeric、decimal、smallmoney、money)之間進(jìn)行比較。 | 數(shù)值類型值不經(jīng)轉(zhuǎn)換便進(jìn)行比較。這有助于提高性能。但這可能會導(dǎo)致行為發(fā)生某些更改,尤其是在轉(zhuǎn)換導(dǎo)致溢出異常的情況下。 | 低 |
| 使用字符串參數(shù)的內(nèi)置元數(shù)據(jù)函數(shù)在其輸入長度大于 4000 個字符的情況下,將截斷該輸入。 | 如果截斷導(dǎo)致丟失非空格字符,則內(nèi)置元數(shù)據(jù)函數(shù)會引發(fā)錯誤。 | 低 |
| 未加引號的標(biāo)識符中被禁用的字符集保持不變。 | Transact-SQL 分析器支持 Unicode 3.2 標(biāo)準(zhǔn),該標(biāo)準(zhǔn)更改了目前禁止在未分隔標(biāo)識符中使用的一些國際字符的字符分類。 | 低 |
| 在出現(xiàn)浮點域錯誤(即 log() 函數(shù)的參數(shù)為負(fù))時,SET ANSI_WARNINGS ON 不覆蓋 SET ARITHABORT OFF 的設(shè)置。如果 ANSI_WARNINGS 為 ON 但 ARITHABORT 為 OFF,則浮點域錯誤不會導(dǎo)致查詢終止。 | SET ANSI_WARNINGS ON 完全覆蓋 ARITHABORT OFF 設(shè)置。在這種情況下,浮點域錯誤將導(dǎo)致查詢終止。 | 低 |
| 允許在 ORDER BY 子句中使用(并忽略)非整數(shù)常量。 | 不允許在 ORDER BY 子句使用非整數(shù)常量。 | 低 |
| 允許使用空的 SET 語句(未指定 SET 選項)。 | 不允許使用空的 SET 子句。 | 低 |
| 沒有為派生表所生成的列正確派生 IDENTITY 屬性。 | 為派生表所生成的列正確派生了 IDENTITY 屬性。 | 低 |
| 對浮點數(shù)據(jù)類型執(zhí)行運算的算術(shù)運算符的可為 Null 性屬性始終可以為 Null。 | 在輸入不可為空并且 ANSI_WARNINGS 為 ON 的情況下,對浮點數(shù)據(jù)類型執(zhí)行運算的算術(shù)運算符的為空性屬性將更改為不可為空值。 | 低 |
| 在使用 UNION 組合的 INSERT ..SELECT 語句中,由各個結(jié)果集生成的類型都將轉(zhuǎn)換為目標(biāo)結(jié)果類型。 | 在使用 UNION 組合的 INSERT ..SELECT 語句中,確定各分支的主要類型,并在將結(jié)果轉(zhuǎn)換為目標(biāo)表類型之前將其轉(zhuǎn)換為該類型。 | 低 |
| 在 SELECT ..FOR XML 語句中,始終實體化 hex(27)('?字符)和 hex(22)("?字符),即使在不需要的情況下也是如此。 | FOR XML 只在需要時才實體化 hex(27) 和 hex(22)。在下列情況下不實體化這些字符:
| 低 |
| 在 FOR XML 中,時間戳值映射為整數(shù)。 | 在 FOR XML 中,時間戳值映射為二進(jìn)制值。 有關(guān)詳細(xì)信息,請參閱?timestamp 數(shù)據(jù)類型的 FOR XML 支持。 | 如果使用timestamp列,則為高;否則為低 |
| 在 FOR XML 和 OPENXML 中,名稱中大范圍 Unicode 字符(3 字節(jié))使用 8 位表示。 例如,FOR XML 用 8 位表示 Unicode 碼位?U+10000?的方式如下: <a_x00010000_ c1="1" /> | 在 FOR XML 和 OPENXML 中,名稱中大范圍 Unicode 字符(3 字節(jié))使用 6 位表示。 例如,FOR XML 用 6 位表示 Unicode 碼位?U+10000?的方式如下: <a_x010000_ c1="1" /> | 低 |
| 在 FOR XML 中,使用 AUTO 模式的派生表映射被視為是透明的。 例如: USE AdventureWorks CREATE TABLE Test(id int); INSERT INTO Test VALUES(1); INSERT INTO Test VALUES(2); SELECT * FROM (SELECT a.id AS a, b.id AS b FROM Test a JOIN Test b ON a.id=b.id) Test FOR XML AUTO;如果?AdventureWorks?的兼容級別設(shè)置為 80,則以上示例將生成: <a a="1"><b b="1"/></a> <a a="2"><b b="2"/></a> | 在 FOR XML 中,使用 AUTO 模式的派生表映射被視為是不透明的。 如果?AdventureWorks?的兼容級別設(shè)置為 90,則以上示例將生成: <Test a="1" b="1"/> <Test a="2" b="2"/> 有關(guān)更改為 AUTO 模式的詳細(xì)信息,請參閱?AUTO 模式的增強功能。 | 如果對視圖應(yīng)用 FOR XML AUTO 模式,則為高;否則為低 |
| 僅在日語和朝鮮語中,字符串到?money?的轉(zhuǎn)換才支持使用反斜杠字符 (\) 作為貨幣符號。 | 在所有語言中,所有字符串到?money?的轉(zhuǎn)換中都接受反斜杠字符 (\)。當(dāng) \ 用作貨幣符號時,ISNUMERIC?將返回 True。 對于 SQL Server 2005 之前的 SQL Server 版本上的數(shù)據(jù)庫,這一新行為會拆分依賴于包含 \ 的 ISNUMERIC 返回值并且所使用的語言既不是日語也不是朝鮮語的索引和計算列。 | 低 |
| 即使操作數(shù)不可為 Null 并且 ANSI_WARNINGS 或 ARITHABORT 設(shè)置為 ON,算術(shù)運算符的結(jié)果也始終可為 Null。 | 在 ANSI_WARNINGS 或 ARITHABORT 設(shè)置為 ON 時,如果兩個操作數(shù)都不可為空,則浮點算術(shù)運算符的結(jié)果也不可為空值。 在以下情況中,這種為空性的更改可能導(dǎo)致錯誤:使用?bcp?從包含計算列(該計算列使用浮點算術(shù)運算符)的 SQL Server 2000 表中大容量導(dǎo)出二進(jìn)制格式的數(shù)據(jù),然后使用?bcp?或 BULK INSERT 將這些數(shù)據(jù)大容量導(dǎo)入包含同一定義的 SQL Server 2005 表。 當(dāng)兩個選項均為 OFF 時,數(shù)據(jù)庫引擎 將把結(jié)果標(biāo)記為可以為 Null。這與 SQL Server 2000 中相同。
| 低 |
| 對于以?nvarchar?作為參數(shù)的內(nèi)置函數(shù),如果所提供的值為?varchar,則該值將轉(zhuǎn)換為?nvarchar(4000)。在 SQL Server 2000 中,如果傳遞較大值,則該值將自行截斷。 | 對于以?nvarchar?作為參數(shù)的內(nèi)置函數(shù),即使所提供的值為varchar,該值仍將轉(zhuǎn)換為?nvarchar(4000)。但如果傳遞較大值,SQL Server 2005 將生成錯誤。 若要以兼容級別 90 運行,必須修復(fù)依賴于截斷行為的所有自定義代碼。 | 低 |
| 固定長度(char、binary?或?nchar)字符串與可變長度(varchar、varbinary、nvarchar)字符串的聯(lián)合返回固定長度的結(jié)果。 | 可變大小字符串和固定大小字符串的聯(lián)合返回可變大小字符串。 若要以兼容級別 90 運行,那么對于任何地方(索引、查詢和計算列),只要它依賴與將可變大小類型和固定大小類型求并集得到的類型,就必須修復(fù)。 | 低 |
| 包含字符 0xFFFF 的對象名是有效標(biāo)識符。 | 包含字符 0xFFFF 的對象名是無效標(biāo)識符,不能訪問。 若要以兼容級別 90 運行,必須重命名包含此字符的對象。 | 低 |
| 在 SELECT ISNUMERIC('<string>') 中,<string>?內(nèi)嵌入的逗號非常重要。 例如,以下?SELECT ISNUMERIC('121212,12')?查詢返回 0。這指示字符串121212,12?不是數(shù)字。 | 在 SELECT ISNUMERIC('<string>') 中,<string>?內(nèi)嵌入的逗號可以忽略。 例如,以下?SELECT ISNUMERIC('121212,12')?查詢返回 1。這指示字符串?121212,12?是數(shù)字。 | 低 |
| 忽略了 Transact-SQL 語句中保留關(guān)鍵字后面的冒號 (:)。 | Transact-SQL 語句中保留關(guān)鍵字后面的冒號 (:) 將導(dǎo)致語句失敗。 | 低 |
| 引用外部查詢中的列的子查詢中的 GROUP BY 子句成功。 | 按照 SQL 標(biāo)準(zhǔn),引用外部查詢中的列的子查詢中的 GROUP BY 子句返回錯誤。 | 低 |
保留關(guān)鍵字
兼容性設(shè)置還確定了數(shù)據(jù)庫引擎所保留的關(guān)鍵字。下表顯示了每個兼容級別所引入的保留關(guān)鍵字。
| 90 | EXTERNAL、PIVOT、UNPIVOT、REVERT、TABLESAMPLE |
| 80 | COLLATE、FUNCTION、OPENXML |
| 70 | BACKUP、CONTAINS、CONTAINSTABLE、DENY、FREETEXT、FREETEXTTABLE、PERCENT、RESTORE、ROWGUIDCOL、TOP |
| 65 | AUTHORIZATION、CASCADE、CROSS、DISTRIBUTED、ESCAPE、FULL、INNER、JOIN、LEFT、OUTER、PRIVILEGES、RESTRICT、RIGHT、SCHEMA、WORK |
在給定兼容級別,保留關(guān)鍵字包括在該級別或較低級別引入的所有關(guān)鍵字。例如,對于兼容級別為 90 的應(yīng)用程序,將保留上表列出的所有關(guān)鍵字。在較低的兼容級別中,級別 90 的關(guān)鍵字仍保留有效的對象名,但與這些關(guān)鍵字相對應(yīng)的級別 90 的語言功能將不可用。
一旦引入,關(guān)鍵字便會保持為保留關(guān)鍵字。例如,在兼容級別 70 中引入的保留關(guān)鍵字 BACKUP 也在級別 80 和 90 中保留。
如果某一應(yīng)用程序使用對其保留級別而言是關(guān)鍵字的標(biāo)識符,則該應(yīng)用程序?qū)⑹ H粢鉀Q這一問題,請用方括號 ([?]) 或引號 ("?") 括起該標(biāo)識符;例如,若要將使用標(biāo)識符EXTERNAL?的應(yīng)用程序升級為兼容級別 90,可以將該標(biāo)識符更改為?[EXTERNAL]?或?"EXTERNAL"。
權(quán)限
只有數(shù)據(jù)庫所有者、sysadmin?固定服務(wù)器角色和?db_owner?固定數(shù)據(jù)庫角色的成員(前提是您要更改當(dāng)前數(shù)據(jù)庫)才能執(zhí)行此過程。
示例
A. 將兼容級別更改為 SQL Server 2000
以下示例將?AdventureWorks?數(shù)據(jù)庫的兼容級別更改為?80。
EXEC sp_dbcmptlevel AdventureWorks, 80; GOB. 兼容級別對 ORDER BY 的影響(第 1 種情況)
以下示例闡述了當(dāng)兼容級別分別為 80 和 90 時 ORDER BY 綁定所存在的差異。此示例在?tempdb?數(shù)據(jù)庫中創(chuàng)建了一個示例表?SampleTable。
USE tempdb; CREATE TABLE SampleTable(c1 int, c2 int); GO在兼容級別 90(默認(rèn)級別)中,以下?SELECT... ORDER BY?語句將因?AS?子句中的列名?c1?不明確而出現(xiàn)錯誤。
SELECT c1, c2 AS c1FROM SampleTableORDER BY c1; GO在將該數(shù)據(jù)庫的兼容級別重置為?80?之后,這一?SELECT... ORDER BY?語句將成功執(zhí)行。
sp_dbcmptlevel tempdb, 80 SELECT c1, c2 AS c1FROM SampleTableORDER BY c1; GO以下?SELECT... ORDER BY 語句在這兩個兼容級別中均可正常執(zhí)行。
sp_dbcmptlevel tempdb, 80 SELECT c1, c2 AS c3 FROM SampleTable ORDER BY c1; GOsp_dbcmptlevel tempdb, 90 SELECT c1, c2 AS c3 FROM SampleTable ORDER BY c1; GOC. 兼容級別對 ORDER BY 的影響(第 2 種情況)
在兼容級別 90(默認(rèn)級別)中,以下?SELECT...ORDER BY?語句將因?ORDER BY?子句中存在附加的表前綴而出現(xiàn)錯誤。
SELECT c1 AS xFROM SampleTableORDER BY SampleTable.x; GO在將該數(shù)據(jù)庫的兼容級別重置為?80?之后,這一?SELECT...ORDER BY?語句將成功執(zhí)行。
sp_dbcmptlevel tempdb, 80 SELECT c1 AS xFROM SampleTableORDER BY SampleTable.x; GO以下?SELECT...ORDER BY?語句在這兩個兼容級別中均可正常執(zhí)行。
sp_dbcmptlevel tempdb, 80 SELECT c1 AS xFROM SampleTableORDER BY x; GO sp_dbcmptlevel tempdb, 90 SELECT c1 AS xFROM SampleTableORDER BY x; GO總結(jié)
以上是生活随笔為你收集整理的SQL Server 2005将某些数据库行为设置为与指定的 SQL Server 版本兼容的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: SQL Server 2005更改当前数
- 下一篇: C#获取本机名及IP地址