共用方式為


SQL Server 2014 中 Database Engine 功能的行為變更

本主題描述 Database Engine 的行為變更。 相較於舊版的 SQL Server,行為變更會影響功能在 SQL Server 2014 中運作或互動的方式。

SQL Server 2014 的行為變更

在舊版的 SQL Server 中,針對包含特定長度超過 4020 個字元之字串的 XML 檔進行查詢可能會傳回不正確的結果。 在 SQL Server 2014 中,這類查詢會傳回正確的結果。

SQL Server 2012 的行為變更

元數據探索

從 SQL Server 2012 開始的 Database Engine 改善,可讓 SQLDescribeCol 取得比舊版 SQLDescribeCol 所傳回之預期結果更精確的描述。 如需詳細資訊,請參閱 元數據探索

在未實際執行查詢的情況下判斷回應格式的 SET FMTONLY 選項已被取代為 sp_describe_first_result_set(Transact-SQL)sp_describe_undeclared_parameters(Transact-SQL)sys.dm_exec_describe_first_result_set(Transact-SQL)sys.dm_exec_describe_first_result_set_for_object(Transact-SQL)

在編寫 SQL Server Agent 工作腳本時的行為變更

從 SQL Server 2012 開始,如果您從現有的作業複製腳本來建立新的作業,新作業可能會不小心影響現有的作業。 若要使用現有作業的腳本建立新作業,請手動刪除參數 @schedule_uid 通常是在現有作業中建立作業排程之區段的最後一個參數。 這會為新作業建立新的獨立排程,而不會影響現有的作業。

CLR User-Defined 函式與方法的常數折疊

從 SQL Server 2012 開始,現在可折迭下列使用者定義的 CLR 物件:

  • 具決定性純量值 CLR 使用者定義函式。
  • CLR 使用者定義型別的決定性方法。

當這些函式或方法多次使用相同的自變數呼叫時,這項改進會尋求增強效能。 不過,當非確定性函式或方法在錯誤中標示為具決定性時,這項變更可能會導致非預期的結果。 CLR 函式或方法的決定性由SqlFunctionAttributeSqlMethodAttributeIsDeterministic屬性值來表示。

STEnvelope() 方法的行為已變更為空的空間類型

具有空白物件之方法的行為 STEnvelope 現在與其他 SQL Server 空間方法的行為一致。

在 SQL Server 2008 中,當呼叫具有空白物件時, STEnvelope 方法會傳回下列結果:

SELECT geometry::Parse('POINT EMPTY').STEnvelope().ToString()  
-- returns POINT EMPTY  
SELECT geometry::Parse('LINESTRING EMPTY').STEnvelope().ToString()  
-- returns LINESTRING EMPTY  
SELECT geometry::Parse('POLYGON EMPTY').STEnvelope().ToString()  
-- returns POLYGON EMPTY  

在 SQL Server 2012 中,使用空物件呼叫 時, STEnvelope 方法現在會傳回下列結果:

SELECT geometry::Parse('POINT EMPTY').STEnvelope().ToString()  
-- returns GEOMETRYCOLLECTION EMPTY  
SELECT geometry::Parse('LINESTRING EMPTY').STEnvelope().ToString()  
-- returns GEOMETRYCOLLECTION EMPTY  
SELECT geometry::Parse('POLYGON EMPTY').STEnvelope().ToString()  
-- returns GEOMETRYCOLLECTION EMPTY  

若要判斷空間物件是否空白,請呼叫 STIsEmpty (geometry 數據類型) 方法。

LOG 函式具有新的選擇性參數

函數 LOG 現在有一個可選的 基底 參數。 如需詳細資訊,請參閱 LOG (Transact-SQL)

分割索引作業期間的統計數據計算已變更

在 SQL Server 2014 中,建立或重建數據分割索引時,不會掃描數據表中的所有數據列來建立統計數據。 相反地,查詢優化器會使用預設取樣演算法來產生統計數據。 升級具有數據分割索引的資料庫之後,您可能會注意到這些索引的直方圖數據有所差異。 這種行為變更可能不會影響查詢效能。 若要在掃描資料表中所有資料列時取得分割區索引的統計資料,使用子句 CREATE STATISTICS 時請使用 UPDATE STATISTICSFULLSCAN

XML 值方法的數據類型轉換已變更

value方法的xml資料型別的內部行為已變更。 這個方法會對 XML 執行 XQuery,並傳回指定之 SQL Server 數據類型的純量值。 xs 類型必須轉換成 SQL Server 數據類型。 先前,方法 value 會在內部將來源值轉換成 xs:string,然後將 xs:string 轉換成 SQL Server 數據類型。 在 SQL Server 2014 中,在下列情況下會略過轉換成 xs:string:

來源 XS 資料類型 目的地 SQL Server 數據類型
位元



整數 (int)

整數



無符號位元組

無符號短整數

無符號整數

無符號長整數

正整數

非正整數

負整數

非負整數
TINYINT

smallint

整數 (int)

bigint

十進位 / 小數

數字的
十進位 / 小數 十進位 / 小數

數字的
浮動 真實
雙倍 浮動

當可以略過中繼轉換時,新的行為可改善效能。 不過,當數據類型轉換失敗時,您會看到不同於從中繼 xs:string 值轉換時引發的錯誤訊息。 例如,如果 value 方法無法將值 100000 轉換為 intsmallint,則先前的錯誤訊息為:

The conversion of the nvarchar value '100000' overflowed an INT2 column. Use a larger integer column.

在 SQL Server 2014 中,若沒有中繼轉換成 xs:string,錯誤訊息為:

Arithmetic overflow error converting expression to data type smallint.

sqlcmd.exe XML 模式中的行為改變

如果您在從 T FOR XML 執行 SELECT * 時,搭配 XML 模式 (:XML ON 命令)使用 sqlcmd.exe,則行為變更。

DBCC CHECKIDENT 修訂的訊息

在 SQL Server 2012 中,DBCC CHECKIDENT 命令返回的訊息只有在使用 RESEED new_reseed_value 來更改當前的身分識別值時才會改變。 新的訊息是 「檢查身分識別資訊:目前的身分識別值 』<current identity value>』」。 DBCC 的執行已經完成。 如果 DBCC 列印錯誤訊息,請連絡您的系統管理員。

在舊版中,訊息為「檢查身分識別資訊:目前的識別值 '<目前的識別值>',目前的欄位值 '<目前的欄位值>'。DBCC 執行已完成。如果 DBCC 列印錯誤訊息,請連絡您的系統管理員。」DBCC CHECKIDENTNORESEED被指定但沒有第二個參數或沒有重新指派的值時,訊息不會改變。 如需詳細資訊,請參閱 DBCC CHECKIDENT (Transact-SQL)

XML 資料類型上 exist() 函式的行為已變更

exist() 函式在將 XML 資料類型與空值比較為 0(零)時,其行為已經改變。 請考慮下列範例:

DECLARE @test XML;  
SET @test = null;  
SELECT COUNT(1) WHERE @test.exist('/dogs') = 0;  

在舊版中,此比較會傳回 1 (true):現在,此比較會傳回 0 (零,false)。

下列比較尚未變更:

DECLARE @test XML;  
SET @test = null;  
SELECT COUNT(1) WHERE @test.exist('/dogs') = 1; -- 0 expected, 0 returned  
SELECT COUNT(1) WHERE @test.exist('/dogs') IS NULL; -- 1 expected, 1 returned  

另請參閱

SQL Server 2014 中 Database Engine 功能的重大變更
SQL Server 2014 中已被取代的 資料庫引擎 功能
SQL Server 2014 中已停止的資料庫引擎功能
ALTER DATABASE 相容性等級 (Transact-SQL)