Sql-Server

SQL Service Pack 會影響 SQL 兼容模式嗎?

  • March 16, 2017

我們很快將從 SQL 2008 R2 實例升級到 SQL 2016 實例。

我們的一個數據庫有一個應用程序,我們的供應商說它與 SQL 2012 SP1 兼容,但不兼容 SQL 2012 SP2、2014 或 2016。

一旦我們升級到 SQL 2016 並將數據庫的兼容級別更改為 110(2012),應用程序與 SQL 2012 SP2 不兼容的事實是否會產生影響?

我最初的回答引用了已棄用的功能而不是已停產的功能。這已得到糾正

Service Pack 級別(包括 RTM)與兼容性級別設置不同。我會解釋:

不同 SQL Server 版本中的功能

SQL Server 為不同版本的 SQL Server 提供了一組豐富的功能。這些功能可以從一個版本刪除到另一個版本。您的應用程序可能正在使用單獨的系統儲存過程、系統功能或其他一些不再可用的功能。

這裡有一個例子:

Category            | Discontinued feature     | Replacement  
--------------------+--------------------------+-------------    
Transact-SQL syntax | COMPUTE / COMPUTE BY     | Use ROLLUP  

因此,如果應用程序使用 COMPUTE 或 COMPUTE BY,那麼這在 SQL Server 2016 中將不再有效,因為它在 SQL Server 2014 中已被刪除。從 SQL Server 版本到 SQL Server 版本的停用功能列表各不相同。

參考:

SQL Server 2016 中

停止使用的數據庫引擎功能 SQL Server 2014 中

停止使用的數據庫引擎功能 SQL Server 2012 中

停止使用的數據庫引擎功能 SQL Server 2008 R2 中停止使用的數據庫引擎功能

兼容級別和它不是什麼

當您設置兼容級別時,您是在告訴數據庫引擎以某些方式執行。

兼容性級別僅影響指定數據庫的行為,而不影響整個伺服器。兼容性級別僅提供與 SQL Server 早期版本的部分向後兼容性。從兼容模式 130 開始,任何影響功能的新查詢計劃都僅添加到新的兼容模式中。

$$ … $$ 使用兼容性級別作為臨時遷移輔助來解決由相關兼容性級別設置控制的行為中的版本差異。$$ … $$如果現有 SQL Server 應用程序受到您的 SQL Server 版本中的行為差異的影響,請將應用程序轉換為與新的兼容模式無縫協作。

您沒有做的是帶回功能。當您升級到 SQL Server 2016 時,您正在刪除/更改SQL Server 功能、過程、函式等。即使您將數據庫兼容性級別設置為“下級 SQL Server 兼容性級別” ,這些功能也將不再可用。

參考:

ALTER DATABASE (Transact-SQL) 兼容性級別

(此連結還包含版本 130 和 120 之間比較的兼容性級別設置列表,以及 120 和更低級別差異的另一個列表。)

因此,當您保留部分向後兼容性時,您可能會破壞您的應用程序,因為某些功能不再可用(參見上面的範例)

回答

正如您在評論中正確指出的那樣,SQL Server 2016 中的兼容模式從 140 到 130 和 120 以及進一步下降到 110 和 100 可用,但兼容模式不會神奇地恢復已從 SQL Server 版本中刪除的功能。

Service Pack 可能會影響您正在升級的版本的兼容模式。例如,如果您要升級的 SQL Server 是 2016 RTM 並且您要升級到 2016 Service Pack 1,那麼兼容性級別 130 的內部工作方式可能會發生變化。但是,這些更改不應影響下級兼容模式。這在以下文章中指出:

從 SQL Server 2016 開始,我們承諾在升級後,如果您堅持使用舊的兼容級別(如 120 或 110),則不會更改計劃。新功能和改進將僅在最新的兼容級別下可用。

參考:

SQL Server 2016 中的查詢優化器添加

引用自:https://dba.stackexchange.com/questions/167115