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