將某些數(shù)據(jù)庫(kù)行為設(shè)置為與指定的 Microsoft® SQL Server™ 的早期版本兼容。
sp_dbcmptlevel [ [ @dbname = ] name ]
[ , [ @new_cmptlevel = ] version ]
[@name =] name
數(shù)據(jù)庫(kù)的名稱(chēng),將對(duì)此數(shù)據(jù)庫(kù)的兼容級(jí)別進(jìn)行更改。數(shù)據(jù)庫(kù)的名稱(chēng)必須遵循標(biāo)識(shí)符的規(guī)則。name 的數(shù)據(jù)類(lèi)型為 sysname,默認(rèn)值為 NULL。
[@new_cmptlevel =] version
數(shù)據(jù)庫(kù)要兼容的 SQL Server 版本。version 的數(shù)據(jù)類(lèi)型為 tinyint,默認(rèn)值為 NULL。該值必須為 80、70、65 或 60。
說(shuō)明 70 和 80 兩個(gè)級(jí)別間的唯一區(qū)別是,級(jí)別 70 不支持 SQL Server 2000 中引入的一些保留關(guān)鍵字。
0(成功)或 1(失?。?/P>
如果沒(méi)有指定參數(shù)或沒(méi)有指定 name 參數(shù),sp_dbcmptlevel 將返回下面的消息:
Valid values of database compatibility level are 60, 65, 70, or 80.
如果指定了 version 而沒(méi)有指定 name,SQL Server 將顯示一條有關(guān)該數(shù)據(jù)庫(kù)的兼容性設(shè)置的消息。
在 SQL Server 2000 中,master 數(shù)據(jù)庫(kù)的兼容級(jí)別為 80,此級(jí)別不能改變。
對(duì)于安裝 SQL Server 2000 的所有實(shí)例,所有數(shù)據(jù)庫(kù)的默認(rèn)級(jí)別為 80。對(duì)于從 SQL Server 7.0 升級(jí)到 SQL Server 2000,所有數(shù)據(jù)庫(kù)的默認(rèn)級(jí)別為 80。對(duì)于從 SQL Server 6.5 和 SQL Server 6.0 升級(jí)到 SQL Server 2000,保持現(xiàn)有默認(rèn)兼容級(jí)別。
用 sp_dbcmptlevel 提供臨時(shí)遷移幫助。由 sp_dbcmptlevel 的兼容級(jí)別設(shè)置控制的 SQL Server 7.0 版或 SQL Server 2000 行為中的不同如果影響了現(xiàn)有 SQL Server 6.x 版應(yīng)用程序,請(qǐng)使用此過(guò)程設(shè)置早期版本行為,直到能夠用 SQL Server 2000 兼容級(jí)別將該應(yīng)用程序轉(zhuǎn)變?yōu)檎_\(yùn)行為止。sp_dbcmptlevel 不能還復(fù)完全向后兼容。
sp_dbcmptlevel 將影響指定數(shù)據(jù)庫(kù)的行為,但不會(huì)影響整個(gè)服務(wù)器。當(dāng)在 USE 語(yǔ)句中將數(shù)據(jù)庫(kù)作為當(dāng)前數(shù)據(jù)庫(kù),或者當(dāng)數(shù)據(jù)庫(kù)作為登錄的默認(rèn)數(shù)據(jù)庫(kù)時(shí),數(shù)據(jù)庫(kù)的兼容性設(shè)置將生效。當(dāng)執(zhí)行存儲(chǔ)過(guò)程時(shí),將使用在其中定義過(guò)程的數(shù)據(jù)庫(kù)的當(dāng)前兼容性級(jí)別。當(dāng)此數(shù)據(jù)庫(kù)中的兼容性設(shè)置更改時(shí),所有存儲(chǔ)過(guò)程將重新編譯。
將兼容性級(jí)別設(shè)置為 65 或 60 將影響這些行為。有關(guān)向后兼容行為的更多信息,請(qǐng)參見(jiàn) SQL Server 向后兼容性詳細(xì)信息。
| 兼容性級(jí)別設(shè)置為 60 或 65 | 兼容級(jí)別設(shè)置為 70 或 80(默認(rèn)值) |
|---|---|
| 帶 GROUP BY 子句但不帶 ORDER BY 子句的 SELECT 語(yǔ)句的結(jié)果集,將由 GROUP BY 列排序。 | GROUP BY 子句本身沒(méi)有排序功能。必須顯式指定 ORDER BY 子句,SQL Server 才能對(duì)結(jié)果集進(jìn)行排序。有關(guān)更多信息,請(qǐng)參見(jiàn) SELECT。 |
| UPDATE 語(yǔ)句的 SET 子句接受以表的別名作為前綴的列。 | 在 UPDATE 語(yǔ)句的 SET 子句中,不接受表的別名。在 SET 子句中指定的表或視圖必須與指定的緊跟在 UPDATE 關(guān)鍵字后的表或視圖相匹配。有關(guān)更多信息,請(qǐng)參見(jiàn)UPDATE。 |
| 在創(chuàng)建 bit 列時(shí),如果在 CREATE TABLE 或 ALTER TABLE 中沒(méi)有顯式地指定 NULL 或 NOT NULL 選項(xiàng),則 bit 列將按 NOT NULL 創(chuàng)建。 | 如果沒(méi)有顯式地指定,則 bit 列的為空性由 SET ANSI_NULL_DFLT_ON 或 SET ANSI_NULL_DFLT_OFF 的會(huì)話(huà)設(shè)置決定,或者由數(shù)據(jù)庫(kù)設(shè)置 SET ANSI NULL DEFAULT 決定。有關(guān)更多信息,請(qǐng)參見(jiàn)SET。 |
| ALTER COLUMN 子句無(wú)法在 ALTER TABLE 上使用。 | ALTER COLUMN 子句可在 ALTER TABLE 上使用。有關(guān)更多信息,請(qǐng)參見(jiàn) ALTER TABLE。 |
| 為表創(chuàng)建的觸發(fā)器將替換同一類(lèi)型的任何現(xiàn)有觸發(fā)器 (INSERT、UPDATE、DELETE)??梢允褂?CREATE TRIGGER 的 WITH APPEND 選項(xiàng)創(chuàng)建同一類(lèi)型的多個(gè)觸發(fā)器。 | 可以附加相同類(lèi)型的觸發(fā)器。觸發(fā)器的名稱(chēng)必須唯一。假定已經(jīng)使用了 WITH APPEND 選項(xiàng)。有關(guān)更多信息,請(qǐng)參見(jiàn) CREATE TRIGGER。 |
| 如果批處理或過(guò)程包含無(wú)效的對(duì)象名,則當(dāng)分析或編譯批處理時(shí),將返回警告消息,并且在執(zhí)行批處理時(shí),將返回錯(cuò)誤信息。 | 當(dāng)分析或編譯批處理時(shí),不會(huì)返回警告消息。當(dāng)執(zhí)行批處理時(shí),將返回錯(cuò)誤信息。有關(guān)延遲的名稱(chēng)解析的更多信息,請(qǐng)參見(jiàn)CREATE PROCEDURE(級(jí)別 4)。 |
通過(guò)忽略表 Y 并將 SELECT 語(yǔ)句結(jié)果插入表 X,下面形式的查詢(xún)可以正確執(zhí)行。INSERT X | 當(dāng)執(zhí)行此查詢(xún)時(shí),SQL Server 將返回語(yǔ)法錯(cuò)誤。 |
| 空字符串文字 (' ') 將作為一個(gè)空格解釋。 | 空字符串文字 (' ') 將作為空字符串解釋。 |
| DATALENGTH('') 返回 1(將 '' 解釋為一個(gè)空格)。 DATALENGTH(N'') 返回 2(將 N'' 解釋為一個(gè) Unicode 空格)。 當(dāng) m = 0 時(shí),LEFT('123', m) 返回 NULL。 當(dāng) m = 0 時(shí),LEFT(N'123', m) 返回 NULL。 LTRIM(' ') 返回NULL。 LTRIM(N' ') 返回 NULL。 當(dāng) m = 0 時(shí),REPLICATE('123', m) 返回 NULL。 當(dāng) m = 0 時(shí),REPLICATE(N'123', m) 返回 NULL。 當(dāng) m = 0 時(shí),RIGHT(N'123', m) 返回 NULL。 當(dāng) m = 0 時(shí),RIGHT('123', m) 返回 NULL。 當(dāng) m 為負(fù)數(shù)時(shí),RIGHT('123', m) 返回 NULL。 當(dāng) m 為負(fù)數(shù)時(shí),RIGHT(N'123', m) 返回 NULL。 RTRIM(' ') 返回 NULL。 RTRIM(N' ') 返回 NULL。 SPACE(0) 返回 NULL。 當(dāng) m 小于字符串長(zhǎng)度或者當(dāng) n = 0 時(shí),SUBSTRING('123', m, n) 返回 NULL。 當(dāng) m 大于字符串的長(zhǎng)度或者當(dāng) n = 0 時(shí),SUBSTRING(N'123', m, n) 返回 NULL。 UPDATETEXT table.textcolumn textpointer > 0 NULL NULL 導(dǎo)致 NULL 值。 | DATALENGTH('') 返回 0。 DATALENGTH(N'') 返回 0。 當(dāng) m = 0 時(shí),LEFT('123', m) 返回空字符串。 當(dāng) m = 0 時(shí),LEFT(N'123', m) 返回空字符串。 LTRIM(' ') 返回空字符串。 LTRIM(N' ') 返回空字符串。 當(dāng) m = 0 時(shí),REPLICATE('123', m) 返回空字符串。 當(dāng) m = 0 時(shí),REPLICATE(N'123', m) 返回空字符串。 當(dāng) m = 0 時(shí),RIGHT('123', m) 返回空字符串。 當(dāng) m = 0 時(shí),RIGHT(N'123', m) 返回空字符串。 當(dāng) m 是負(fù)數(shù)時(shí),RIGHT('123', m) 返回空字符串。 當(dāng) m 為負(fù)數(shù)時(shí),RIGHT(N'123', m) 返回錯(cuò)誤信息。 RTRIM(' ') 返回空字符串。 RTRIM(N' ') 返回空字符串。 SPACE(0) 返回空字符串。 當(dāng) m 小于字符串的長(zhǎng)度或者當(dāng) n = 0 時(shí),SUBSTRING('123', m, n) 返回空字符串。 當(dāng) m 大于字符串的長(zhǎng)度或者當(dāng) n = 0 時(shí),SUBSTRING(N'123', m, n) 返回空字符串。 UPDATETEXT table.textcolumn textpointer > 0 NULL NULL 導(dǎo)致空文本。 |
| 僅當(dāng)模式和表達(dá)式同時(shí)為空時(shí),CHARINDEX 和 PATINDEX 函數(shù)才返回空。 | 當(dāng)任何輸入?yún)?shù)為 NULL 時(shí),CHARINDEX 和 PATINDEX 函數(shù)將返回 NULL。 |
| 引用 inserted 和 deleted 表中的 text 或 image 列時(shí),將顯示為 NULL。 | 不允許引用 inserted 和 deleted 表中的 text 或 image 列。 |
| 允許 UPDATETEXT 將 text 列初始化為 NULL。 | UPDATETEXT 將 text 列初始化為空字符串。WRITETEXT 將 text 列初始化為 NULL。 |
| 如果 sp_dboption 的設(shè)置選項(xiàng) concatenation of null yields null 處于關(guān)閉狀態(tài)(禁用),則當(dāng)串聯(lián)操作中的任何操作數(shù)為空時(shí)返回空字符串。 | 如果 sp_dboption 的設(shè)置選項(xiàng) concatenation of null yields null 處于打開(kāi)狀態(tài)(啟用),則當(dāng)串聯(lián)操作中的任何操作數(shù)為空時(shí)返回 NULL。 |
| 在 INSERT 語(yǔ)句中,允許在 VALUES 子句中使用可以返回標(biāo)量值的 SELECT。 | INSERT 語(yǔ)句不能在 VALUES 子句中將 SELECT 語(yǔ)句用作插入值之一。 |
| 由 INSERT table EXEC procedure 語(yǔ)句引用的存儲(chǔ)過(guò)程中的 ROLLBACK 語(yǔ)句將導(dǎo)致 INSERT 回滾,但批處理繼續(xù)執(zhí)行 | 由 INSERT...EXEC 子句引用的存儲(chǔ)過(guò)程中的 ROLLBACK 語(yǔ)句將導(dǎo)致整個(gè)事務(wù)回滾,并使批處理終止執(zhí)行。 |
| 在觸發(fā)器中檢索 inserted 或 deleted 表的 text 或 image 列,將返回 text 或 image 列的 NULL值。 | 不允許在觸發(fā)器中檢索 inserted 或 deleted 表的 text 或 image 列,否則將出錯(cuò)。 |
兼容性級(jí)別對(duì)保留關(guān)鍵字也有影響。下表顯示在指定級(jí)別上為保留關(guān)鍵字而用在較低級(jí)別的對(duì)象名中仍有效的單詞。在較低兼容性級(jí)別上,與較高級(jí)別保留關(guān)鍵字對(duì)應(yīng)的語(yǔ)言功能將失效。
| 兼容性級(jí)別 | 保留關(guān)鍵字 |
|---|---|
| 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 |
無(wú)法在 master 數(shù)據(jù)庫(kù)中更改兼容性級(jí)別設(shè)置,但是可以在 model 數(shù)據(jù)庫(kù)中對(duì)此進(jìn)行更改,以使其在所有新建的數(shù)據(jù)庫(kù)中生效。無(wú)法在存儲(chǔ)過(guò)程內(nèi)部或 EXEC('string') 語(yǔ)法執(zhí)行的 Transact-SQL 字符串中更改兼容性級(jí)別。無(wú)法在 Transact-SQL 語(yǔ)句的批處理中更改兼容性級(jí)別。
只有 DBO、sysadmin 固定服務(wù)器角色成員、db_owner 固定數(shù)據(jù)庫(kù)角色成員(如果即將改變兼容級(jí)別的數(shù)據(jù)庫(kù)是當(dāng)前數(shù)據(jù)庫(kù))才能執(zhí)行此過(guò)程。
此示例通過(guò)將 pubs 數(shù)據(jù)庫(kù)的兼容級(jí)別設(shè)置為 60 來(lái)創(chuàng)建名為 distributed 的過(guò)程,distributed 是 SQL Server 保留關(guān)鍵字。
CREATE PROCEDURE distributed
AS
PRINT 'This won't happen'
EXEC sp_dbcmptlevel 'pubs', 60
CREATE PROCEDURE distributed
AS
PRINT 'You are in a procedure that could not be defined'
PRINT 'in a version of SQL Server 6.5 or later'
PRINT 'without the compatibility setting.'
EXEC distributed
下面是結(jié)果集:
Msg 156, Level 15, State 1相關(guān)文章
Incorrect syntax near the keyword 'distributed'.
DBCC execution completed. If DBCC printed error messages, see your System Administrator.
You are in a procedure that could not be defined
in a version of SQL Server 6.5 or greater
without the compatibility setting.