sp_dbcmptlevel (Transact-SQL)
更新: 2006 年 7 月 17 日
設定要相容於指定 SQL Server 版本的特定資料庫行為。
語法
sp_dbcmptlevel [ [ @dbname = ] name ]
[ , [ @new_cmptlevel = ] version ]
引數
- [ @dbname= ] name
這是將要變更相容性層級的資料庫名稱。資料庫名稱必須符合識別碼的規則。name 是 sysname,預設值是 NULL。
[ @new_cmptlevel= ] version
這是要與資料庫相容的 SQL Server 版本。version 是 tinyint,預設值是 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 時,將資料庫設為相容性層級 60,部分作業會發生錯誤。
傳回碼值
0 (成功) 或 1 (失敗)
結果集
如果未指定參數或未指定 name 參數,則 sp_dbcmptlevel 會傳回錯誤。
如果指定 name 時沒有同時指定 version,則 SQL Server 2005 Database Engine 會傳回一則訊息,顯示指定資料庫目前的相容性層級。
備註
所有 SQL Server 2005 安裝架構的預設相容性層級都是 90。除非 model 資料庫具有更低的相容性層級,否則使用 SQL Server 2005 建立的資料庫都是設定在這個層級。當資料庫從任何舊版 SQL Server 升級到 SQL Server 2005 時,資料庫會保留其現有的相容性層級。系統和使用者資料庫都會套用這個層級。您可以使用 sp_dbcmptlevel,將資料庫的相容性層級設定為 90。若要檢視資料庫目前的相容性層級,請查詢 sys.databases 目錄檢視中的 compatibility_level 資料行。
使用 sp_dbcmptlevel 來提供回溯相容性
sp_dbcmptlevel 預存程序只會影響指定資料庫而非整部伺服器的行為。對於 SQL Server 的較早版本,sp_dbcmptlevel 只提供部分回溯相容性。請使用 sp_dbcmptlevel 做為暫時移轉,協助您解決相關的相容性層級設定所控制之行為的版本差異。如果現有的 SQL Server 應用程式受到 SQL Server 2005 中行為差異的影響,請轉換應用程式,以便正常運作。然後,您可以使用 sp_dbcmptlevel,將相容性層級設定為 90。當資料庫下一次成為目前的資料庫 (無論是在登入時當做預設資料庫,或在 USE 陳述式中指定) 時,新的相容性設定就會生效。
含有索引檢視表的資料庫不能改成相容性層級小於 80 的資料庫。
最佳作法
在使用者與資料庫仍連接時變更相容性層級,可能會讓使用中的查詢產生不正確的結果集。例如,如果在編譯查詢計劃時變更相容性層級,編譯的計劃可能會同時以新的和舊的相容性層級為基礎,而導致不正確的計劃以及可能不精確的結果。此外,如果計劃是放入計劃快取且重複用於後續的查詢,問題可能更嚴重。若要避免發生不精確的查詢結果,建議您使用下列程序變更資料庫的相容性層級:
- 使用 ALTER DATABASE SET SINGLE_USER 將資料庫設定為單一使用者存取模式。
- 變更資料庫的相容性層級。
- 使用 ALTER DATABASE SET MULTI_USER 將資料庫設定成多使用者存取模式。
- 如需有關設定資料庫存取模式的詳細資訊,請參閱<ALTER DATABASE (Transact-SQL)>。
SET 選項
新功能可在更舊的相容性層級之下運作,但 SET 選項可能需要調整。例如,在相容性層級 80 之下使用 xml 資料類型需要使用適當的 ANSI SET 選項。此外,當資料庫的相容性層級設定為 90 時,將 ANSI_WARNINGS 設定為 ON 會將 ARITHABORT 隱含設定為 ON。如果資料庫的相容性層級是設定為 80 或更低,ARITHABORT 選項就必須明確地設定為 ON。如需詳細資訊,請參閱<影響結果的 SET 選項>。
相容性層級和預存程序
當執行預存程序時,它會使用定義所在資料庫之目前的相容性層級。當資料庫的相容性設定改變時,也會同時自動重新編譯它的所有預存程序。
使用 sp_dbcmptlevel 時的環境考量
每個 sp_dbcmptlevel 呼叫都必須個別提交。無法從其他內容中呼叫 sp_dbcmptlevel,例如:
- 預存程序。
- 使用 EXEC(string) 語法執行的 Transact-SQL 字串。
- Transact-SQL 陳述式批次。
層級 60 或 65 與層級 70、80 或 90 之間的行為差異
將相容性層級設定為 60 或 65 會影響許多行為。其中包括下表的左資料行所列出的情況。
附註: |
---|
關於影響 6.x 應用程式的其他差異,請參閱本主題後面的「更低相容性層級和層級 90 之間的差異」一節,以及「備註」一節中的 post-6.x 保留關鍵字。 |
相容性層級設定 60 或 65
相容性層級設定 70 或更高
含有 GROUP BY 子句但沒有 ORDER BY 子句的 SELECT 陳述式,其結果集是依 GROUP BY 資料行來排序。
GROUP BY 子句不會自行排序。您必須明確指定 ORDER BY 子句,SQL Server 才能排序結果集。如需詳細資訊,請參閱<SELECT (Transact-SQL)>。
UPDATE 陳述式的 SET 子句接受前置資料表別名的資料行。
UPDATE 陳述式的 SET 子句不接受資料表別名。SET 子句中指定的資料表或檢視表,必須符合 UPDATE 關鍵字之後緊接著指定的資料表或檢視表。如需詳細資訊,請參閱<UPDATE (Transact-SQL)>。
當 CREATE TABLE 或 ALTER TABLE 中沒有明確的 NULL 或 NOT NULL 選項時,所建立的 bit 資料行會建立為 NOT NULL。
沒有明確 Null 屬性的 bit 資料行,其 Null 屬性由工作階段設定 SET ANSI_NULL_DFLT_ON / SET ANSI_NULL_DFLT_OFF 或資料庫設定 SET ANSI NULL DEFAULT 來決定。如需詳細資訊,請參閱<SET (Transact-SQL)>。
ALTER TABLE 不能使用 ALTER COLUMN 子句。
ALTER TABLE 可以使用 ALTER COLUMN 子句。如需詳細資訊,請參閱<ALTER TABLE (Transact-SQL)>。
為了資料表而建立的觸發程序會取代任何相同類型的現有觸發程序 (INSERT、UPDATE、DELETE)。CREATE TRIGGER 的 WITH APPEND 選項可用來建立多個相同類型的觸發程序。
會附加相同類型的觸發程序。觸發程序名稱必須是唯一的。假設使用 WITH APPEND 選項。如需詳細資訊,請參閱<CREATE TRIGGER (Transact-SQL)>。
當批次或程序包含無效的物件名稱時,剖析或編譯批次會傳回警告訊息,執行批次會傳回錯誤訊息。
如果是無效的本機物件,剖析或編譯批次不會傳回警告,執行批次仍會傳回錯誤訊息。
不過,延遲名稱解析 (DNR) 不支援無效的遠端物件;如果在程序中使用無效的遠端資料表,建立程序會失敗並傳回錯誤。
附註:
DNR 支援 (在編譯期間參考執行時才存在之物件的能力) 只適用於資料表或檢視表名稱。如需延遲名稱解析的詳細資訊,請參閱 CREATE PROCEDURE (Transact-SQL)。
藉由忽略 Y
資料表以及將 SELECT
陳述式結果插入 X
資料表中,來適當執行下列格式的查詢。
INSERT X
SELECT select_list INTO Y
當執行這個相同的查詢時,Microsoft SQL Server 7.0 或更新版本會傳回語法錯誤。
空字串常值 (' ') 的解譯結果是一個空白。
空字串常值 (' ') 的解譯結果是一個空字串。
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。
當 integer_expression 是負數時,RIGHT('123', integer_expression) 會傳回 NULL。
當 integer_expression 是負數時,RIGHT(N'123', integer_expression) 會傳回 NULL。
RIGHT('123', 0) 傳回一個空字串。
RIGHT(N'123', 0) 傳回一個空字串。
當 integer_expression 是負數時,RIGHT('123', integer_expression) 會傳回錯誤。當 integer_expression 是負數時,RIGHT(N'123', integer_expression) 會傳回錯誤。
RTRIM(' ') 傳回 NULL。
RTRIM(N' ') 傳回 NULL。
RTRIM(' ') 傳回一個空字串。
RTRIM(N' ') 傳回一個空字串。
SPACE(0) 傳回 NULL。
SPACE(0) 傳回一個空字串。
如果指定的 start 值大於 expression 中的字元數 , 或者 length 等於零,則 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 會產生 Null 值。
UPDATETEXT table.textcolumn textpointer 0 NULL NULL 會產生空白文字。
只有在模式和運算式都是 NULL 時,CHARINDEX 和 PATINDEX 函數才會傳回 NULL。
當有任何輸入參數是 NULL 時,CHARINDEX 和 PATINDEX 函數會傳回 NULL。
將 inserted 和 deleted 資料表中之 text 或 image 資料行的參考會顯示為 NULL。
不允許參考 inserted 和 deleted 資料表中之 text 或 image 資料行。
在觸發程序內從 inserted 或 deleted 資料表擷取 text 或 image 資料行,會傳回 text 或 image 資料行的 NULL 值。
不允許在觸發程序內從 inserted 或 deleted 資料表擷取 text 或 image 資料行,這會造成錯誤。
允許 UPDATETEXT 將 text 資料行初始化為 NULL。
UPDATETEXT 將 text 資料行初始化為一個空字串。
WRITETEXT 將 text 資料行初始化為 NULL。
關閉 (停用) sp_dboption 的 [串連 Null 產生 Null] 設定,如果串連作業中的任何運算元是 NULL,就會傳回一個空字串。
開啟 (啟用) sp_dboption 的 [串連 Null 產生 Null] 設定,如果串連作業中的任何運算元是 NULL,就會傳回 NULL。
在 INSERT 陳述式中,VALUES 子句允許 SELECT 陳述式傳回純量值。
INSERT 陳述式的 VALUES 子句不能用 SELECT 陳述式來做為要插入的值之一。
INSERT table EXEC procedure 陳述式所參考的預存程序之 ROLLBACK 陳述式會回復 INSERT 陳述式,但批次會繼續執行。
INSERT...EXEC 陳述式所參考的預存程序之 ROLLBACK 陳述式會回復整個交易,批次也會停止執行。
更低相容性層級和層級 90 之間的差異
此小節描述相容性層級 90 所導入的新行為。關於其他影響相容性層級 80 和更低相容性層級的行為差異,請參閱本節稍後的「保留關鍵字」一節。
當使用相容性層級 90 時,將產生下列行為變更。
相容性層級設定 80 或更低
相容性層級設定 90
影響的可能性
對於 FROM 子句中的鎖定提示而言,WITH 關鍵字一律是選擇性的。
但有某些例外,僅當利用 WITH 關鍵字指定提示時,FROM 子句才會支援資料表提示。如需詳細資訊,請參閱<FROM (Transact-SQL)>。
高
支援外部聯結的 *= 和 =* 運算子,使用警告訊息。
不支援這些運算子;應該使用 OUTER JOIN 關鍵字。
高
WHEN 會將 ORDER BY 清單中的資料行參考繫結至 SELECT 清單中定義的資料行,模稜兩可的資料行會被忽略,有時也會忽略資料行前置詞。這可能導致結果集以非預期的順序傳回。
例如,會接受由單一兩部分資料行 (<table_alias>.<column>) 所組成的 ORDER BY 子句 (該資料行是用來當做 SELECT 清單中之資料行的參考),但資料表別名會被忽略。請看下列查詢。
SELECT c1 = -c1 FROM t
_table AS x ORDER BY x.c1
在執行時,ORDER BY 中的資料行前置詞會被忽略。排序作業不會依預期在指定的來源資料行 (x.c1
) 上進行,而是在定義於查詢中的衍生 c1
資料行上進行。這個查詢的執行計劃顯示會先計算衍生資料行的值,然後再排序計算出的值。
資料行模稜兩可會發生錯誤。如果 ORDER BY 指定了資料行前置詞,當繫結至 SELECT 清單中所定義的資料行時,便不會忽略這些前置詞。
請看下列查詢。
SELECT c1 = -c1 FROM t
_table AS x ORDER BY x.c1
在執行時,不會忽略 ORDER BY 子句中的資料行前置詞。排序作業會依預期在指定的來源資料行 (x.c1
) 上進行。這個查詢的執行計劃顯示資料列從 t_table
傳回之排序運算子的順序,然後再計算定義於 SELECT 清單中的衍生資料行 c1
的值。
中
在不同資料類型 UNION 的 INSERT SELECT 中,每個 UNION 分支都會直接轉換成 INSERT 目的地資料行的類型。即使本身使用的聯集會因類型轉換不相容而失敗,INSERT SELECT 也會使 UNION 成功,因為 UNION 結果類型的分支永遠不會轉換。
在 SQL Server 2005 中,UNION 結果類型的衍生與 INSERT SELECT 無關。UNION 的每個分支都會轉換成 UNION 的結果類型,之後,再轉換成 INSERT 的目的地資料行類型。如果 UNION 中有不相容的類型,第一個轉換可能造成錯誤。若要執行相容性層級 90,您必須先修復 INSERT SELECT 內所用的所有不相容的類型聯集。
中
當檢視表或參考的檢視表使用 TOP 子句時,指定 WITH CHECK OPTION 子句的檢視表無法正確支援透過檢視表執行的插入及更新作業。
當檢視表或參考的檢視表使用 TOP 子句時,使用 WITH CHECK OPTION 的檢視表無法支援透過檢視表執行的插入及更新作業。
中
可變長度資料行和固定長度資料行的 UNION 產生固定長度的資料行。
可變長度資料行和固定長度資料行的 UNION 產生可變長度的資料行。
中
在觸發程序內,允許使用 SET XACT_ABORT OFF。
在觸發程序內,不允許使用 SET XACT_ABORT OFF。
中
在檢視表內,允許 (但會忽略) FOR BROWSE 子句。
在檢視表內,不允許使用 FOR BROWSE 子句。
中
網域錯誤不是由 ANSI_WARNINGS 控制。如果 ANSI_WARNINGS 設為 OFF 且 ARITHABORT 沒有變更,便接受 ARITHABORT 設定。
網域錯誤也由 ANSI_WARNINGS 控制,而且是嚴重性 16 的錯誤。如果 ANSI_WARNINGS 或 ARITHABORT 是 ON,便會發生錯誤,而不是傳回 NULL 值。相依於設為 OFF 的 ARITHABORT 之使用者指令碼,可能會因這項變更而中斷。
中
如果對遠端資料來源 [OpenRowset 或 OpenQuery] 的 PassThrough 查詢產生名稱重複的資料行,除非查詢中明確地命名資料行,否則,會忽略重複的資料行名稱。
如果對遠端資料來源 [OpenRowset 或 OpenQuery] 的 PassThrough 查詢產生含有重複資料行名稱的資料行,便會發生錯誤。
低
大小超出 8000 的字元字串常數和 varbinary 常數會當做 text、ntext 或 image 來處理。
大小超出 8000 的字元字串常數和 varbinary 常數會當做 varchar(max) 類型 (或分別為 nvarchar(max) 和 varbinary(max)) 來處理。如果 SELECT 清單包含這類運算式,如此便可以變更利用 SELECT … INTO 來建立的資料表之資料類型。
低
藉由將類型階層中優先順序較低的比較元轉換成優先順序較高的類型,來進行數值類型 (smallint、tinyint、int、bigint、numeric、decimal、smallmoney、money) 的比較。
數值類型的值,不進行轉換,直接比較。這可增進效能。不過,這可能改變某些行為,當轉換會造成溢位例外狀況時,尤其如此。
低
如果輸入長度超出 4000 個字元,採用字串引數的內建中繼資料函數會截斷其輸入。
如果這項截斷作業會造成非空白字元遺失,內建中繼資料函數便會發生錯誤。
低
不含引號的識別碼中所不允許使用的字元集,仍保持不變。
Transact-SQL 剖析器支援 Unicode 3.2 標準,它變更了非分隔識別碼中目前不允許使用的某些國際字元的字元分類。
低
在浮點網域錯誤的狀況下,SET ANSI_WARNINGS ON 不會覆寫 SET ARITHABORT OFF 的設定 [也就是說,log() 函數的負值引數]。如果 ANSI_WARNINGS 是 ON,但 ARITHABORT 是 OFF,浮點網域錯誤並不會使查詢終止。
SET ANSI_WARNINGS ON 會完整覆寫 ARITHABORT OFF 設定。這種狀況的浮點網域錯誤會使查詢終止。
低
在 ORDER BY 子句中,允許 (但會忽略) 非整數常數。
在 ORDER BY 子句中,不允許非整數常數。
低
允許空白 SET 陳述式 (未指派 SET 選項)。
不允許空白 SET 子句。
低
沒有針對衍生資料表所產生的資料行,正確衍生出 IDENTITY 屬性。
針對衍生資料表所產生的資料行,正確衍生出 IDENTITY 屬性。
低
浮點資料類型算術運算子的 Null 屬性永遠可為 Null。
在輸入不可為 Null 且 ANSI_WARNINGS 為 ON 的狀況下,浮點資料類型算術運算子的 Null 屬性改成不可為 Null。
低
在 INSERT ..SELECT 陳述式 (包含 UNION) 中,個別結果集產生的類型會全部轉換成目標結果類型。
在 INSERT ..SELECT 陳述式 (包含 UNION) 中,各個分支的主要類型已確定,結果在轉換成目標資料表類型之前,會先轉換成這個類型。
低
在 SELECT ..FOR XML 陳述式中,hex(27) (' 字元) 和 hex(22) (" 字元) 一律實體化,即使沒有必要,也是如此。
FOR XML 只在必要時,才將 hex(27) 和 hex(22) 實體化。在下列情況下,它們不會實體化:
- 在屬性內容中,如果用 " 來分隔屬性值,便不會將 hex(27) (' 字元) 實體化,如果用 ' 來分隔屬性值,便不會將 hex(22) (" 字元) 實體化。
- 在元素內容中,hex(27) 和 hex(22) 永遠不實體化。
低
在 FOR XML 中,時間戳記值對應到整數。
在 FOR XML 中,時間戳記值對應到二進位值。
如需詳細資訊,請參閱<Timestamp 資料類型的 FOR XML 支援>。
高 (如果使用 timestamp 資料行的話);否則,低
在 FOR XML 和 OPENXML 中,用 8 個位置來表示名稱中的高範圍 Unicode 字元 (3 個位元組)。
例如,當使用 8 個位置時,FOR XML 會用下列方式來表示 Unicode 字碼指標 U+10000
:
<a_x00010000_ c1="1" />
在 FOR XML 和 OPENXML 中,用 6 個位置來表示名稱中的高範圍 Unicode 字元 (3 個位元組)。
例如,當使用 6 個位置時,FOR XML 會用下列方式來表示 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 的相容性層級設為 80 時,上述範例會產生:
<a a="1"><b b="1"/></a>
<a a="2"><b b="2"/></a>
在 FOR XML 中,會以不透明的方式來處理 AUTO 模式的衍生資料表對應。
當 AdventureWorks 的相容性層級設為 90 時,上述範例會產生:
<Test a="1" b="1"/>
<Test a="2" b="2"/>
如需有關 AUTO 模式變更的詳細資訊,請參閱<AUTO 模式增強功能>。
高 (如果在檢視表上套用 FOR XML AUTO 模式);否則,低
字串至 money 的轉換只支援在日文和韓文等語言中,利用反斜線字元 (\) 來做為貨幣符號。
所有語言的所有字串至 money 的轉換,都接受反斜線字元 (\)。當利用 \ 來做為貨幣符號時,ISNUMERIC 會傳回 True。
在 SQL Server 2005 之前的舊版 SQL Server 資料庫中,這個新行為會中斷相依於含有 \ 的 ISNUMERIC 傳回值,且語言不是日文和韓文的索引與計算的資料行。
低
算術運算子的結果永遠可為 Null,即使運算元不可為 Null 且 ANSI_WARNINGS 或 ARITHABORT 設定為 ON,也是如此。
當 ANSI_WARNINGS 或 ARITHABORT 設為 ON 時,如果兩個運算元都不可為 Null,浮點算術運算子的結果便不可為 Null。
當使用 bcp,從含有計算資料行 (使用符點算術運算元) 的 SQL Server 2000 資料表中大量匯出二進位格式資料,再使用 bcp 或 BULK INSERT,將這項資料大量匯入到含有相同定義的 SQL Server 2005 資料表時,這項 Null 屬性的變更便會失敗。
附註:
當兩個選項都是 OFF 時,Database Engine 會將結果標示為可為 Null。這與 SQL Server 2000 相同。
低
對於採用 nvarchar 做為參數的內建函數,如果提供的值是 varchar,這個值會轉換成 nvarchar(4000)。在 SQL Server 2000 中,如果傳送較大的值,會以無訊息的方式來截斷這個值。
對於採用 nvarchar 做為參數的內建函數,如果提供的值是 varchar,這個值仍會轉換成 nvarchar(4000)。不過,如果傳送較大的值,SQL Server 2005 會產生錯誤。
若要執行相容性層級 90,您必須先修復會依賴截斷行為的任何自訂程式碼。
低
含有可變長度 (varchar、varbinary、nvarchar) 字串的固定長度 (char、binary 或 nchar) 字串的聯集,會傳回固定長度結果。
可變大小字串和固定大小字串的聯集,會傳回可變大小的字串。
若要在相容性層級 90 中執行,您必須修復相依於可變大小類型和固定大小類型的聯集所產生之類型的所有位置 (索引、查詢和計算的資料行)。
低
包含 0xFFFF 字元的物件名稱是有效的識別碼。
包含 0xFFFF 字元的物件名稱不是有效的識別碼,而且無法存取。
若要在相容性層級 90 中執行,您必須重新命名包含這個字元的物件。
低
在 SELECT ISNUMERIC('<string>') 中,<string> 內的內嵌逗號很重要。
例如,下列 SELECT ISNUMERIC('121212,12')
查詢會傳回 0。這就表示字串 121212,12
不是數值。
在 SELECT ISNUMERIC('<string>') 中,<string> 內的內嵌逗號會被忽略。
例如,下列 SELECT ISNUMERIC('121212,12')
查詢會傳回 1。這就表示字串 121212,12
是數值。
低
忽略 Transact-SQL 中保留關鍵字之後的冒號 (:)。
Transact-SQL 中保留關鍵字之後的冒號 (:) 將導致陳述式失敗。
低
如果子查詢有參考來自外部查詢的資料行,則該子查詢中的 GROUP BY 子句會成功執行。
如果子查詢有參考來自外部查詢的資料行,則該子查詢中的 GROUP BY 子句會依照 SQL 標準傳回錯誤。
低
保留關鍵字
相容性設定也決定了 Database Engine 所保留的關鍵字。下表顯示每個相容性層級所導入的保留關鍵字。
相容性層級設定 | 保留關鍵字 |
---|---|
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 |
在給定的相容性層級中,保留關鍵字包含這個層級或這個層級以下所導入的所有關鍵字。因此,例如,對於在層級 90 的應用程式而言,前面的資料表所列出的所有關鍵字都會保留下來。在較低的相容性層級中,層級 90 的關鍵字仍是有效的物件名稱,但對應於這些關鍵字的層級 90 語言功能則無法使用。
導入之後,關鍵字會維持保留狀態。例如,相容性層級 70 所導入的保留關鍵字 BACKUP,也會保留在層級 80 和 90 中。
如果應用程式使用的識別碼是其相容性層級的保留關鍵字,應用程式便會失敗。若要解決這個問題,請用方括號 ([]) 或引號 ("") 來括住識別碼;例如,若要將使用識別碼 EXTERNAL 的應用程式升級到相容性層級 90,您可將識別碼改成 [EXTERNAL] 或 "EXTERNAL"。
權限
只有資料庫擁有者、系統管理員 (sysadmin) 固定伺服器角色的成員和 db_owner 固定資料庫角色 (如果您變更目前的資料庫的話) 能夠執行這個程序。
範例
A. 將相容性層級變更為 SQL Server 2000
下列範例將 AdventureWorks
資料庫的相容性層級改成 80
。
EXEC sp_dbcmptlevel AdventureWorks, 80;
GO
B. 相容性層級在 ORDER BY 上的作用 (狀況 1)
下列範例說明相容性層級 80 和 90 在 ORDER BY 繫結中的差異。這個範例會在 tempdb
資料庫中建立範例資料表 SampleTable
。
USE tempdb;
CREATE TABLE SampleTable(c1 int, c2 int);
GO
在相容性層級 90 (預設值) 中,下列 SELECT... ORDER BY
陳述式會產生錯誤,因為 AS
子句 c1
中的資料行名稱模稜兩可。
SELECT c1, c2 AS c1
FROM SampleTable
ORDER BY c1;
GO
將資料庫重設為相容性層級 80
之後,相同的 SELECT... ORDER BY
陳述式就會成功。
sp_dbcmptlevel tempdb, 80
SELECT c1, c2 AS c1
FROM SampleTable
ORDER BY c1;
GO
下列 SELECT... ORDER B
Y 陳述式在兩個相容性層級中都能夠運作。
sp_dbcmptlevel tempdb, 80
SELECT c1, c2 AS c3
FROM SampleTable
ORDER BY c1;
GO
sp_dbcmptlevel tempdb, 90
SELECT c1, c2 AS c3
FROM SampleTable
ORDER BY c1;
GO
C. 相容性層級在 ORDER BY 上的作用 (狀況 2)
在相容性層級 90 (預設值) 中,下列 SELECT...ORDER BY
陳述式會產生錯誤,因為 ORDER BY
子句中有其他資料表前置詞。
SELECT c1 AS x
FROM SampleTable
ORDER BY SampleTable.x;
GO
將資料庫重設為相容性層級 80
之後,相同的 SELECT...ORDER BY
陳述式就會成功。
sp_dbcmptlevel tempdb, 80
SELECT c1 AS x
FROM SampleTable
ORDER BY SampleTable.x;
GO
下列 SELECT...ORDER BY
陳述式在兩個相容性層級中都能夠運作。
sp_dbcmptlevel tempdb, 80
SELECT c1 AS x
FROM SampleTable
ORDER BY x;
GO
sp_dbcmptlevel tempdb, 90
SELECT c1 AS x
FROM SampleTable
ORDER BY x;
GO
請參閱
參考
Database Engine 預存程序 (Transact-SQL)
ALTER DATABASE (Transact-SQL)
ALTER TABLE (Transact-SQL)
CREATE PROCEDURE (Transact-SQL)
CREATE TRIGGER (Transact-SQL)
EXECUTE (Transact-SQL)
保留關鍵字 (Transact-SQL)
SELECT (Transact-SQL)
SET (Transact-SQL)
系統預存程序 (Transact-SQL)
UPDATE (Transact-SQL)
其他資源
資料庫相容性層級選項
新的 FOR XML 功能
設定資料庫選項
使用 SQL Server 中的選項
說明及資訊
變更歷程記錄
版本 | 歷程記錄 |
---|---|
2006 年 7 月 17 日 |
|
2006 年 4 月 14 日 |
|