本主題描述 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 函式或方法的決定性由SqlFunctionAttribute或SqlMethodAttribute的IsDeterministic屬性值來表示。
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 STATISTICS 或 FULLSCAN。
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)