Sql-Server-2008

如何檢測兼容性錯誤 - SQL Server 2012

  • January 23, 2018

我正在將數據庫的兼容模式從 90 (SQL Server 2005) 更改為 110 (SQL 2012),我想知道如果有任何中斷更改,我會在什麼時候看到錯誤。

我執行了 Upgrade Advisor 2012,它發現了幾個需要更新的儲存過程。一個例子是:

“在 SQL Server 2005 或更高版本中,ORDER BY 子句中的列別名不能以表別名作為前綴。”

但是,當我在 SQL 2012 中執行此儲存過程(未進行更改)時,它不會顯示任何錯誤。此外,當我將數據庫兼容級別從 90 更改為 110 時,也沒有出現錯誤。當我恢復數據庫時也沒有。

如果我在任何地方都沒有看到錯誤,我希望升級顧問能抓住一切。還有其他方法可以檢查兼容性錯誤嗎?

另外,即使升級顧問告訴我它會失敗,這個儲存過程怎麼可能成功執行?謝謝 :)

你能顯示查詢嗎?僅僅因為它執行並不意味著它是正確的。:-) 例如,這是不合法的,但它有效:

SELECT CONVERT(SMALLDATETIME, modify_date) AS modify_date
FROM sys.objects AS o
ORDER BY o.modify_date;

從技術上講,它應該如下,因為o.modify_date不在SELECT列表中:

SELECT CONVERT(SMALLDATETIME, modify_date) AS modify_date
FROM sys.objects AS o
ORDER BY modify_date;

這個 Connect bug中,據說這條規則將從升級顧問中刪除。我懷疑發生了以下情況之一(或兩者):

  1. 他們忘記了刪除規則,因為他們說他們會
  2. 他們還有其他復雜情況,阻止了上述語法被解析器阻塞

話雖如此,升級顧問永遠無法捕捉到一些重大變化。例如,這將適用於 2005、2008 和 2008 R2:

CREATE TABLE #foo(id INT);

IF OBJECT_ID('tempdb..#foo') > 0
BEGIN
 DROP TABLE #foo;
END
GO

CREATE TABLE #foo(id INT);

但是,這將在 SQL Server 2012 中中斷,因為 #temp 表現在得到一個負的 object_id。正確的測試方法是:

IF OBJECT_ID('tempdb..#foo') IS NOT NULL

我在這篇博文中討論了其他一些問題。其他幾個重大變化:

如果您使用任何與記憶體相關的 DMV,則對某些列進行了大修:

同樣,升級顧問沒有捕捉到其中的大部分,因此執行該工具而不進行任何徹底的測試可能真的會讓你陷入困境。

我同意Eric 的回答——您應該嘗試跟踪已棄用的事件。為了完整起見,這裡有三種方法:

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