2011-10-24 68 views
3

我在包含一個函數的腳本中無意中使用了一對SQL Server 2008 T-SQL功能,該功能將部署到衆多客戶數據庫中,其中一些將SQL 2005SQL Server 2008 T-SQL功能不考慮兼容性水平

違規語句的一個例子:

create function dbo.fnThisWontWorkOnSQL2005 
    () 
returns varchar(max) 
as 
begin 
    declare @intCounter int = 2 
    return @intCounter 
end 

select dbo.fnThisWontWorkOnSQL2005() 

在一個SQL2008實例,這將返回2.

在一個SQL2005實例這個建議「不能默認值賦給一個局部變量「。

然而,兼容級別運行在SQL2008 R2實例設置一個SQL 2005數據庫的代碼順利地執行和返回2

我的問題出現,因爲我在SQL2008R2實例開發和我曾以爲,設置目標數據庫與SQL Server 2005的兼容級別會標記任何無效的T-SQL,儘管這種情況不會發生,或者至少我無法找到阻止它發生的事情。

有沒有人知道一種方法來防止這種情況發生?我搜索了各種各樣,但無法找到一種方式,它感覺像是一個錯誤,或者我總是需要開發我將部署到最低的SQL版本?

+0

僅供參考:「deighters」不是正確的詞:我猜你的意思是新的「功能」 – gbn

+0

我只在Microsoft網站http://technet.microsoft.com/en-us/library/cc721270找到這個名字%28SQL.100%29.aspx這就是他們所稱的 Transact-SQL Delighters Transact-SQL提升程序是一項小的增強,它在很大程度上有助於使編程體驗更加方便。本節涵蓋以下Transact-SQL提取器:聲明和初始化變量,複合賦值運算符,通過VALUES子句提供的表值構造器支持,以及增強的CONVERT函數 –

+0

由非母語英語者(Itzik is Israeli)撰寫。我將改述:這個詞有微妙的泛音不適合公共論壇 – gbn

回答

6

這是正確的。

兼容性級別並不意味着「完全像老版本一樣運行」
這意味着「我在修復代碼時不太經常破解」。

永不假定:檢查。這是ALTER DATABASE says on MSDN說(我的粗體):

兼容級別提供了與SQL Server早期版本的唯一部分向後兼容性。使用兼容級別作爲臨時遷移輔助工具來解決由相關兼容級別設置控制的行爲中的版本差異。如果現有的SQL Server應用程序是通過SQL Server 2008中行爲差異的影響,將應用程序轉換才能正常工作

如果你的目標的SQL Server 2005,SQL Server 2005的開發上見developing SQL 2005 application using SQL 2008 server

+0

我明白了,但這肯定是相反的,它提供了向前兼容性,因爲SQL2005數據庫正在運行一段它不應該識別的代碼。 從微軟的角度來看,這也很奇怪。他們不希望我留在SQL2000上,直到每個最後的數據庫都轉換爲最新最好的數據庫。 –

+1

當您將SQL Server 2005數據庫升級到更高版本時,它會升級數據庫。它不再是SQL Server 2005數據庫。嘗試恢復或將其重新附加到SQL Server 2005服務器上:它會失敗。這同樣適用於服務包和一些修補程序,而不僅僅是發佈。請參閱http://stackoverflow.com/questions/6857924/restore-sql-2008-db-r2-to-sql2008-no-r2/6857958#6857958 – gbn

+0

這很有道理。我需要更加小心我寫的內容,並儘可能在最早的版本中編寫最低版本號。非常感謝 –

2

然而,在SQL 2005數據庫上 通過設置兼容級別運行的代碼運行愉快地進行了SQL2008 R2實例,並返回2.

更改到兼容級別90不會將數據庫更改爲SQL Server 2005數據庫,它仍然是SQL Server 2008 R2數據庫。

兼容性級別不會阻止您在SQL Server 2008中執行任何操作,它可以使SQL Server 2005中的函數在SQL Server 2008中的行爲與以前的行爲一樣。

1

OK,這個問題已經回答了死刑,但還殺了它:

兼容級別功能的功能旨在幫助確保SQL Server 2005的應用程序可以用最少的或SQL Server上沒有變化工作2008實例(或基本上任何2個版本之間)。它的唯一目的是處理更改語法,其中現有的代碼可能會在2008年(或您處理的任何後續版本)中正常工作。

有一個巨大的東西,是在2005年和2008年的數據庫非常有用的,即使設置爲80(SQL Server 2000中)兼容級別列表: - MERGE語句 - 熱膨脹係數 - 爲申報參數 默認值 - 新數據類型(例如NVarChar(最大)) - 列表繼續。

我很尷尬的說我的主要系統仍然在SQL Server 2000兼容模式下運行,即使我們現在在SQL Server 2008 R2上;我們正在使用很多很多新功能,我們從未想過要修復所有的表格提示。兼容性級別是爲像我這樣的懶惰人創造的:)(或者更確切地說,爲了減少升級時的摩擦,以幫助銷售更多單位的新版本,並減少老版本sql服務器上的必要支持窗口 - 他們自己的好目標對)。