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

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

SQL Server 2014 的行為變更

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

SQL Server 2012 中的行為變更

中繼資料探索

從 SQL Server 2012 開始,Database Engine 的改善可讓 SQLDescribeCol 取得比舊版 SQL Server中 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 使用者定義函數和方法的常數摺疊

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

  • 具決定性、純量值的 CLR 使用者定義函數。
  • CLR 使用者定義類型的具決定性方法。

此改進旨在於這些函數或方法都使用相同的引數多次呼叫時提高效能。 但在不具決定性函數或方法因誤標記為具決定性時,此變更可能會導致非預期的結果。 CLR 函數或方法的決定性是由 IsDeterministicSqlFunctionAttributeSqlMethodAttribute 屬性值所指出。

空白空間類型之 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 中,建立或重建分割索引時,不會掃描資料表中的所有資料列來建立統計資料。 反之,查詢最佳化工具會使用預設的取樣演算法來產生統計資料。 升級具有分割區索引的資料庫之後,可能會注意到這些索引之長條圖資料的差異。 此行為變更可能不會影響查詢效能。 若要在掃描資料表中所有資料列時取得分割區索引的統計資料,使用子句 FULLSCAN 時請使用 CREATE STATISTICSUPDATE STATISTICS

XML value 方法的資料類型轉換已變更

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

來源 XS 資料類型 目的地 SQL Server 資料類型
byte

short

int

整數

long

unsignedByte

unsignedShort

unsignedInt

unsignedLong

positiveInteger

nonPositiveInteger

negativeInteger

nonNegativeInteger
TINYINT

SMALLINT

int

BIGINT

decimal

NUMERIC
decimal decimal

NUMERIC
FLOAT real
double FLOAT

可以略過中繼轉換時,新行為會提高效能。 但在資料類型轉換失敗時,您會看到不同於從中繼 xs:string 值轉換時所引發的錯誤訊息。 例如,如果 value 方法無法將 int 值 100000 轉換為 smallint,以前的錯誤訊息是:

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.

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

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

DBCC CHECKIDENT 修訂的訊息

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

在舊版中,訊息為「檢查身分識別資訊:目前的識別值 ' < current identity value > ',目前的資料行值 ' < current column value > '。DBCC 執行已完成。如果 DBCC 列印錯誤訊息,請連絡您的系統管理員。」當使用 NORESEED 指定時 DBCC CHECKIDENT ,若沒有第二個參數,或沒有重新設定的值,則訊息不會變更。 如需詳細資訊,請參閱 DBCC CHECKIDENT (Transact-SQL)

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

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

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 中已被取代的 Database Engine 功能
SQL Server 2014 中已停止的 Database Engine 功能
ALTER DATABASE 相容性層級 (Transact-SQL)