日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

SQL Server 2005将某些数据库行为设置为与指定的 SQL Server 版本兼容

發布時間:2023/12/4 数据库 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 SQL Server 2005将某些数据库行为设置为与指定的 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 數據庫引擎將返回一條消息,顯示指定數據庫的當前兼容級別。

備注

對于所有 SQL Server 2005 安裝,默認的兼容級別都為 90。除非?model?數據庫有更低的兼容級別,否則 SQL Server 2005 中創建的數據庫會設置為該級別。在將數據庫從 SQL Server 的任何早期版本升級到 SQL Server 2005 之后,該數據庫將保留其現有的兼容級別。這既適用于系統數據庫也適用于用戶數據庫。可使用?sp_dbcmptlevel?將數據庫的兼容級別更改為 90。若要查看數據庫的當前兼容級別,請查詢?sys.databases?目錄視圖中的?compatibility_level?列。

使用 sp_dbcmptlevel 以獲得向后兼容性

sp_dbcmptlevel?存儲過程只影響指定數據庫的行為,而不影響整個服務器的行為。sp_dbcmptlevel?只提供與 SQL Server 的早期版本的部分向后兼容性。將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 之間的差異”以及“備注”部分中的 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)。

    在創建?bit?列時,如果在 CREATE TABLE 或 ALTER TABLE 中沒有顯式地指定 NULL 或 NOT NULL 選項,則該列將按 NOT NULL 創建。

    如果沒有顯式地指定,則?bit?列的為空性由 SET ANSI_NULL_DFLT_ON/SET ANSI_NULL_DFLT_OFF 的會話設置決定,或者由 SET ANSI NULL DEFAULT 的數據庫設置決定。有關詳細信息,請參閱?SET (Transact-SQL)。

    ALTER COLUMN 子句無法在 ALTER TABLE 上使用。

    ALTER COLUMN 子句可在 ALTER TABLE 上使用。有關詳細信息,請參閱?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?等于 0,則函數 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 將產生空值。

    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?的?concatenation of null yields null?設置處于關閉狀態(禁用),則當串聯操作中的任何操作數為 NULL 時將返回空字符串。

    如果?sp_dboption?的?concatenation of null yields 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 關鍵字。

    在將 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?列執行。此查詢的執行計劃將顯示:首先計算派生列的值,然后對計算得到的值進行排序。

    如果存在列的多義性,則將引發錯誤。在綁定到 SELECT 列表中所定義的列時,不忽略在 ORDER BY 中指定的列前綴(如果有)。

    請考慮下面的查詢。

    SELECT c1 = -c1 FROM t_table AS x ORDER BY x.c1

    執行時,不忽略 ORDER BY 子句中的列前綴。排序操作對指定的源列 (x.c1) 按預期方式執行。此查詢的執行計劃將顯示排序運算符對從?t_table?返回的行排序,然后再對在 SELECT 列表中定義的派生列c1?的值排序。

    在 INSERT SELECT 中,如果 UNION 屬于不同的數據類型,則每個 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)所執行的直接傳遞查詢生成名稱重復的列,則除非在該查詢中顯式命名了這些列,否則將忽略重復的列名。

    如果對遠程數據源(OpenRowset?或?OpenQuery)所執行的直接傳遞查詢生成列名重復的列,將引發錯誤。

    大小大于 8000 的字符串常量和?varbinary?常量被視為?textntext?或?image

    大小大于 8000 的字符串常量和?varbinary?常量被視為varchar(max)?類型(或分別被視為?nvarchar(max)?和varbinary(max))。如果 SELECT 列表包含此類表達式,則這樣可以更改使用 SELECT … INTO 創建的表的數據類型。

    通過將類型層次結構中優先級較低的比較數轉換為優先級較高的類型,從而在各數值類型(smallinttinyintintbigintnumericdecimalsmallmoneymoney)之間進行比較。

    數值類型值不經轉換便進行比較。這有助于提高性能。但這可能會導致行為發生某些更改,尤其是在轉換導致溢出異常的情況下。

    使用字符串參數的內置元數據函數在其輸入長度大于 4000 個字符的情況下,將截斷該輸入。

    如果截斷導致丟失非空格字符,則內置元數據函數會引發錯誤。

    未加引號的標識符中被禁用的字符集保持不變。

    Transact-SQL 分析器支持 Unicode 3.2 標準,該標準更改了目前禁止在未分隔標識符中使用的一些國際字符的字符分類。

    在出現浮點域錯誤(即 log() 函數的參數為負)時,SET ANSI_WARNINGS ON 不覆蓋 SET ARITHABORT OFF 的設置。如果 ANSI_WARNINGS 為 ON 但 ARITHABORT 為 OFF,則浮點域錯誤不會導致查詢終止。

    SET ANSI_WARNINGS ON 完全覆蓋 ARITHABORT OFF 設置。在這種情況下,浮點域錯誤將導致查詢終止。

    允許在 ORDER BY 子句中使用(并忽略)非整數常量。

    不允許在 ORDER BY 子句使用非整數常量。

    允許使用空的 SET 語句(未指定 SET 選項)。

    不允許使用空的 SET 子句。

    沒有為派生表所生成的列正確派生 IDENTITY 屬性。

    為派生表所生成的列正確派生了 IDENTITY 屬性。

    對浮點數據類型執行運算的算術運算符的可為 Null 性屬性始終可以為 Null。

    在輸入不可為空并且 ANSI_WARNINGS 為 ON 的情況下,對浮點數據類型執行運算的算術運算符的為空性屬性將更改為不可為空值。

    在使用 UNION 組合的 INSERT ..SELECT 語句中,由各個結果集生成的類型都將轉換為目標結果類型。

    在使用 UNION 組合的 INSERT ..SELECT 語句中,確定各分支的主要類型,并在將結果轉換為目標表類型之前將其轉換為該類型。

    在 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 中,名稱中大范圍 Unicode 字符(3 字節)使用 8 位表示。

    例如,FOR XML 用 8 位表示 Unicode 碼位?U+10000?的方式如下:

    <a_x00010000_ c1="1" />

    在 FOR XML 和 OPENXML 中,名稱中大范圍 Unicode 字符(3 字節)使用 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?的兼容級別設置為 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 并且 ANSI_WARNINGS 或 ARITHABORT 設置為 ON,算術運算符的結果也始終可為 Null。

    在 ANSI_WARNINGS 或 ARITHABORT 設置為 ON 時,如果兩個操作數都不可為空,則浮點算術運算符的結果也不可為空值。

    在以下情況中,這種為空性的更改可能導致錯誤:使用?bcp?從包含計算列(該計算列使用浮點算術運算符)的 SQL Server 2000 表中大容量導出二進制格式的數據,然后使用?bcp?或 BULK INSERT 將這些數據大容量導入包含同一定義的 SQL Server 2005 表。

    當兩個選項均為 OFF 時,數據庫引擎 將把結果標記為可以為 Null。這與 SQL Server 2000 中相同。 注意:

    對于以?nvarchar?作為參數的內置函數,如果所提供的值為?varchar,則該值將轉換為?nvarchar(4000)。在 SQL Server 2000 中,如果傳遞較大值,則該值將自行截斷。

    對于以?nvarchar?作為參數的內置函數,即使所提供的值為varchar,該值仍將轉換為?nvarchar(4000)。但如果傳遞較大值,SQL Server 2005 將生成錯誤。

    若要以兼容級別 90 運行,必須修復依賴于截斷行為的所有自定義代碼。

    固定長度(charbinary?或?nchar)字符串與可變長度(varcharvarbinarynvarchar)字符串的聯合返回固定長度的結果。

    可變大小字符串和固定大小字符串的聯合返回可變大小字符串。

    若要以兼容級別 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 子句成功。

    按照 SQL 標準,引用外部查詢中的列的子查詢中的 GROUP BY 子句返回錯誤。

    保留關鍵字

    兼容性設置還確定了數據庫引擎所保留的關鍵字。下表顯示了每個兼容級別所引入的保留關鍵字。

    兼容級別設置 保留關鍵字

    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 c1FROM SampleTableORDER BY c1; GO

    在將該數據庫的兼容級別重置為?80?之后,這一?SELECT... ORDER BY?語句將成功執行。

    sp_dbcmptlevel tempdb, 80 SELECT c1, c2 AS c1FROM SampleTableORDER BY c1; GO

    以下?SELECT... ORDER BY 語句在這兩個兼容級別中均可正常執行。

    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; GO

    C. 兼容級別對 ORDER BY 的影響(第 2 種情況)

    在兼容級別 90(默認級別)中,以下?SELECT...ORDER BY?語句將因?ORDER BY?子句中存在附加的表前綴而出現錯誤。

    SELECT c1 AS xFROM SampleTableORDER BY SampleTable.x; GO

    在將該數據庫的兼容級別重置為?80?之后,這一?SELECT...ORDER BY?語句將成功執行。

    sp_dbcmptlevel tempdb, 80 SELECT c1 AS xFROM SampleTableORDER BY SampleTable.x; GO

    以下?SELECT...ORDER BY?語句在這兩個兼容級別中均可正常執行。

    sp_dbcmptlevel tempdb, 80 SELECT c1 AS xFROM SampleTableORDER BY x; GO sp_dbcmptlevel tempdb, 90 SELECT c1 AS xFROM SampleTableORDER BY x; GO

    總結

    以上是生活随笔為你收集整理的SQL Server 2005将某些数据库行为设置为与指定的 SQL Server 版本兼容的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。