SQL Server 2012 中對於 Database Engine 功能的行為變更
本主題描述 Database Engine 中的行為變更。 行為變更會影響 SQL Server 2012 中功能的運作或互動方式 (相較於舊版的 SQL Server)。
中繼資料探索
從 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 函數或方法的決定性是由 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 函數現在有選擇性 base 參數。 如需詳細資訊,請參閱<LOG (Transact-SQL)>。
資料分割索引作業期間的統計資料計算已變更
SQL Server 2012 並不會在建立或重建資料分割索引之後掃描資料表中所有的資料列建立統計資料。 反之,查詢最佳化工具會使用預設的採樣演算法來產生統計資料。 升級具有資料分割索引的資料庫之後,可能會注意到這些索引之長條圖資料的差異。 此行為變更可能不會影響查詢效能。 如果要在掃描資料表中所有資料列時取得資料分割索引的統計資料,請使用 CREATE STATISTICS 或 UPDATE STATISTICS 搭配 FULLSCAN 子句。
XML value 方法的資料類型轉換已變更
xml資料類型之 value方法的內部行為已變更。 此方法會針對 XML 執行 XQuery 並傳回指定之 SQL Server 資料類型的純量值。 xs 類型必須轉換為 SQL Server 資料類型。 以前 value 方法會在內部將來源值轉換為 xs:string,然後將 xs:string 轉換為 SQL Server 資料類型。 在 SQL Server 2012 中,下列情況下會略過 xs:string 的轉換:
來源 XS 資料類型 |
目的地 SQL Server 資料類型 |
---|---|
byte short int integer 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 2012,如果沒有 xs:string 的中繼轉換,錯誤訊息是:
Arithmetic overflow error converting expression to data type smallint.
XML 模式中的 sqlcmd.exe 行為變更
如果您在執行 SELECT * from T FOR XML ... 時,搭配 XML 模式 (:XML ON 命令) 使用 sqlcmd.exe,會發生行為變更。 如需詳細資訊,請參閱<管理能力增強功能 (Database Engine)>。
DBCC CHECKIDENT 修訂的訊息
在 SQL Server 2012 中,僅當使用 DBCC CHECKIDENT 命令搭配 RESEED new_reseed_value 來變更目前的識別值時,此命令傳回的訊息才會變更。 新訊息是「檢查識別資訊: 目前識別值 '<目前識別值>'」。 DBCC 的執行已經完成。 如果 DBCC 印出錯誤訊息,請連絡您的系統管理員」。
舊版的訊息是「正在檢查識別資訊: 目前的識別值 '<目前的識別值>',目前的資料行值 '<目前的資料行值>'」。 DBCC 的執行已經完成。 如果 DBCC 印出錯誤訊息,請連絡您的系統管理員」。搭配 NORESEED 指定了 DBCC CHECKIDENT,但沒有第二個參數或沒有 reseed 值時,訊息保持不變。 如需詳細資訊,請參閱<DBCC CHECKIDENT (Transact-SQL)>。
XML 資料類型上之 exist() 函數的行為已變更
比較具有 Null 值的 XML 資料類型與 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 2012 中對於 Database Engine 的重大變更
SQL Server 2012 中已被取代的 Database Engine 功能