2017-07-24 77 views
1

我們最近遇到了一個問題,即我們的開發團隊編寫的SQL包括SQL Server 2012/2014的新功能,並且SQL Server 2014在2008 compatibility中運行時允許使用該功能。SQL Server兼容性級別不起作用

當我開發服務器上運行該

EXEC SP_DBCMPTLEVEL '<insert db>' 
GO 

IF 1=1 
    THROW 51000, 'values match', 1; 
GO 

它返回

當前兼容級別爲100
消息51000,級別16,狀態1, 5個線
值匹配

在生產中,相同的SQL顯示了這一點:

當前兼容級別是100
消息102,級別15,狀態1, 線5附近
'扔' 不正確的語法。

我們還沒有升級我們的生產SQL Server,並且正在運行到部署問題。 THROW是SQL Server 2012新增的一個關鍵字,因此我預計2008服務器會突破語法。看起來兼容級別對我來說是打破了。

可以做些什麼來防止在開發環境中允許不兼容的SQL?

+0

您誤解兼容性級別。您的代碼即使在兼容性級別爲90的數據庫中也能在SQL Server 2012上運行,但它不會在2012年下的SQL Server上執行 – sepupic

+0

同樣的事情是,如果您嘗試在SQL Server 2008及更低版本上使用超前/滯後,您將獲得一個錯誤。但是你可以在2012年使用CL 100或甚至90的數據庫 – sepupic

回答

0

根據文檔(https://technet.microsoft.com/en-us/library/bb510680(v=sql.110).aspx

兼容性水平提供 SQL Server早期版本的只有部分的向後兼容性。

因此,在引用的鏈接中,您可以看到什麼兼容模式可以影響的列表。

爲了避免這種問題,根據經驗我的建議是:開發和生產必須是相同的(儘可能)。如果沒有,例如在計劃升級期間,至少測試環境必須與生產類似。

在過去,我們不得不凍結釋放cicle幾天(除了關鍵的bugfix)。