SQL Server 2005 中對於 Database Engine 功能的行為變更
更新: 2006 年 7 月 17 日
此主題描述 Microsoft SQL Server 2005 中某些 Database Engine 功能的行為與它們在舊版 SQL Server 中之行為比較後的一些改變。
備份和復原
當您還原現有的資料庫時,在完整或大量記錄復原模式下還原資料庫之前,SQL Server 2005 都會要求您先備份記錄結尾。除非 RESTORE 陳述式包含 WITH REPLACE 或 WITH STOPAT 子句,否則,嘗試在未備份記錄結尾之前還原資料庫的話,會產生錯誤。如需詳細資訊,請參閱<結尾記錄備份>。
資料指標
下表列出會發生在 SQL Server 2000 但不會發生在 SQL Server 2005 的隱含資料指標轉換。解決方法是要求特定類型的資料指標,而不依賴隱含轉換。
狀況 | 在 SQL Server 2000 中,資料指標是從 | 轉換至 |
---|---|---|
包含內嵌資料表值函數的查詢。 |
動態/索引鍵集 |
靜態 |
查詢參考遠端物件。 |
向前快轉 |
索引鍵集 |
查詢不包含資料表。 |
向前快轉 |
靜態 |
查詢包含資料表函數。 |
向前快轉 |
靜態 |
查詢包含衍生資料表。 |
向前快轉 |
靜態 |
查詢包含多重陳述式資料表函數。 |
動態 索引鍵集 |
索引鍵集至靜態 靜態 |
查詢包含虛擬資料表。 |
動態/索引鍵集 |
靜態 |
查詢包含有 TOP 的檢視。 |
向前快轉 |
靜態 |
查詢包含可更新的資料分割的檢視。 |
向前快轉 |
靜態 |
API 資料指標查詢包含有唯一存取路徑的索引檢視,但不在基底資料表層級。 |
索引鍵集 |
靜態 |
API 資料指標查詢包含沒有叢集索引或唯一索引鍵的資料表。 |
索引鍵集 |
靜態 |
API 資料指標結果集包含 text、ntext 或 image 資料行。 |
向前快轉 |
動態 |
SQL Server 2005 不支援非同步產生索引鍵集驅動或靜態 Transact-SQL 資料指標。Transact-SQL 資料指標作業 (例如 OPEN 或 FETCH) 一般為批次式;因此,不需要非同步產生 Transact-SQL 資料指標。SQL Server 2005 繼續支援非同步索引鍵集驅動或靜態 API 伺服器資料指標,其中低度延遲 OPEN 是一個考量,因為每一個資料指標作業需要用戶端往返。
在 SQL Server 2005 中,若在不含唯一索引的資料表上宣告動態資料指標,並在資料指標之外刪除一個資料列,則資料指標的後續重新整理會擷取含有 NULL 資料的資料列的預留位置。在舊版的 SQL Server 中,資料指標不傳回受影響的資料列。
在 SQL Server 2005 中,如果在批次或預存程序內,可透過條件式邏輯產生不同的資料指標宣告,則透過資料指標執行的 INSERT、UPDATE 和 DELETE 陳述式會造成重新編譯。在 SQL Server 2000 中,這些陳述式不會造成重新編譯。
在下列範例中,UPDATE
陳述式將造成模組重新編譯。
IF(@some_condition=1)
DECLARE c CURSOR FOR
SELECT region FROM db.dbo.mytable ORDER BY lastname
ELSE
DECLARE c CURSOR FOR
SELECT postalcode FROM db.dbo.mytable ORDER BY firstname
...
FETCH NEXT FROM c
...
UPDATE db.dbo.mytable
SET firstname='a' WHERE CURRENT OF c
若要避免重新編譯,請依下列方式重寫程式碼:
IF (@some_condition=1)
BEGIN
DECLARE c CURSOR FOR
SELECT region FROM db.dbo.mytable ORDER BY lastname
FETCH NEXT FROM c
UPDATE db.dbo.mytable
SET firstname='a' WHERE CURRENT OF c
END
ELSE
BEGIN
DECLARE c CURSOR FOR
SELECT postalcode FROM db.dbo.mytable ORDER BY firstname
FETCH NEXT FROM c
UPDATE db.dbo.mytable
SET firstname='a' WHERE CURRENT OF c
END
在 SQL Server 2005 中,除非在查詢中指定較高的鎖定提示,否則,資料指標捲動鎖定會取得 S (共用) 到 U (升級) 的鎖定升級。SQL Server 2000 會直接為捲動鎖定資料指標加入 U 鎖定提示。SQL Server 2005 行為可以有更好的並行性,但可能使並行資料指標有死結的機會 (訊息 1205)。請使用 UPDLOCK 提示來達到您要的行為。如需詳細資訊,請參閱<資料表提示 (Transact-SQL)>。
在 SQL Server 2000 中,當不止一次出現在資料指標擷取緩衝區的資料行或資料列值更新時,因為提取緩衝區的大小或緩衝區內的資料列位置,其他出現次數並不會反映此更新。在 SQL Server 2005 中,會更新提取緩衝區的資料列,使值永遠保持一致,不管提取緩衝區大小或資料列的位置如何都一樣。
在 SQL Server 2000 中,包含 UNION ALL 陳述式的資料指標,依據 UNION 的第一個聯集,會不正確傳回可更新性資訊。因此,有些資料指標被認為可更新,其實不然。SQL Server 2005 會報告 UNION ALL 結果為已計算,故不可更新。如果所有資料指標資料列是來自單一資料表或檢視,您可以將查詢變更為使用 IN 或 OR 子句而非 UNION,來定義可更新的資料指標。
在 SQL Server 2000 中,當 CURSOR_CLOSE_ON_COMMIT 選項設為 ON,在認可交易時,連接中的所有資料指標會關閉。在 SQL Server 2005 中,只有在目前交易內開啟的資料指標才會在交易認可時關閉。在交易開始之前開啟的資料指標會保持開啟。
SQL Server 2000 可允許一些無效的資料指標宣告,並將其轉換成其他類型的資料指標。SQL Server 2005 則不允許無效的宣告。例如,同時要求可更新性和非敏感度的資料指標在 SQL Server 2005 中為無效,且會因錯誤而失敗。
資料庫、資料和記錄檔
SQL Server 2000 行為 | SQL Server 2005 行為 |
---|---|
AUTO_CLOSE 資料庫選項是一個同步處理序,當資料庫被一個重複建立及中斷 Database Engine 連接的應用程式存取時,此處理序會降低效能。 |
AUTO_CLOSE 處理序為非同步。重複開啟和關閉資料庫不會再降低效能。 |
原始資料分割上的檔案不會自動成長;因此,當 os_file_name 指定原始資料分割時,並不需要 MAXSIZE 和 FILEGROWTH 參數。 |
原始資料分割上的檔案可自動成長。可指定 MAXSIZE 和 FILEGROWTH 參數。 |
權限不是在每一個資料庫的資料和記錄檔上設定的。 |
每當做業套用至資料庫時,權限會在資料和記錄檔上設定:
已建立修改以加入新檔案
已附加已備份
已卸離已還原
|
檔案所在目錄如有開放權限,這個權限可防止檔案遭到竄改。如需詳細資訊,請參閱<保護資料和記錄檔>。
附註:
Microsoft SQL Server 2005 Express Edition 不會設定資料和記錄檔的權限。
連結伺服器和分散式查詢
在升級時,使用 'SQLOLEDB' 定義為提供者名稱的連結伺服器將修改為 'SQLNCLI' (SQL Native Client OLE DB 提供者)。sys.sysservers 相容性檢視所顯示的連結伺服器是使用 'SQLNCLI' 做為 'SQLOLEDB'。SQL Server 2005 目錄檢視 sys.servers 顯示的連結伺服器是使用 'SQLNCLI' 做為 'SQLNCLI'。
當 SQL Server 是在 Fiber 模式下執行時,不支援異質性查詢和 OLE DB 提供者的使用。當輕量型共用進階組態選項設為 1 時,會啟用 Fiber 模式。
SQL Native Client OLE DB Provider 無法跨處理序具現化。
在 SQL Server 2005 中,不會向用戶端傳播來自連結伺服器的警告訊息。這類警告的最重要類別如下:
- ANSI 相容的警告:在彙總計算中已刪去 NULL 值
- 算術溢位警告
比方說,如果 col1
有 Null 值,則下列 Transact-SQL 陳述式會產生警告訊息:
SELECT SUM(col1)
FROM <Table>
GROUP BY col2
在 SQL Server 2000 和更舊的版本中,連結伺服器會向用戶端傳播警告訊息。在 SQL Server 2005 中,連結伺服器不會這麼做。
在 SQL Server 2000 中,當遠端預存程序因為編譯階段錯誤 (例如不正確參數繫結) 而未順利執行時,傳回值/狀態是設為 0。當此狀況發生在 SQL Server 2005 時,傳回值/狀態是設為 NULL。
查詢處理器架構
對於以下列格式提交的批次,SQL Server 2000 和 SQL Server 2005 在重新編譯期間使用參數值的方式不同:
- 預存程序
- 使用 sp_executesql
- 準備陳述式
當 SQL Server 2000 重新編譯這些批次時,它使用呼叫批次的參數值做為重新編譯的一部分。當 SQL Server 2005 重新編譯這些查詢時,它使用在造成重新編譯的陳述式之前存在的參數值。這些值與原來傳遞至批次的那些值可能不同。如需詳細資訊,請參閱<參數和執行計劃的重複使用>。
安全性
功能 | SQL Server 2000 行為 | SQL Server 2005 行為 |
---|---|---|
GRANT ALL |
授與所有適用的權限。 |
對物件和陳述式授與 ALL 權限已被取代。執行 GRANT ALL 時,會發生下列情況:
SQL Server 2005 在不同範圍提供可用來管理使用者權限的其他權限。例如,CONTROL 權限可用來授與物件類似擁有權的權限。 |
密碼比較 |
SQL Server 2000 會維護每個 SQL Server 登入密碼的兩個版本。一個是使用者提供的實際密碼,另一個是由 SQL Server 轉換成全部大寫字母的密碼。這樣會啟用密碼不區分大小寫驗證。雖然此行為對許多使用者而言很方便,卻會使密碼猜測攻擊更容易發生,因為它減少可能的密碼數。 |
只儲存實際密碼。使用者輸入的密碼必須符合儲存在伺服器上的密碼。如果密碼不符合儲存在 SQL Server 的密碼,則登入失敗。如果忘記密碼字元的正確大小寫,必須重設密碼。 |
變更 sa 帳戶的預設語言 |
SQL Server sa 帳戶的預設語言就是安裝或升級時所選取的語言。 在舊版 Microsoft SQL Server 中,執行 sp_configure 以變更伺服器的預設語言時,也會更新 sa 帳戶的預設語言。 |
若要在 SQL Server 2005 中變更 sa 帳戶的預設語言,則您必須執行 sp_defaultlanguage 預存程序,並執行 DBCC FREESYSTEMCACHE 命令,然後啟動新的工作階段。執行 sp_configure 以變更伺服器的預設語言,並不會更新 sa 帳戶的預設語言。 |
系統預存程序
下表列出 Database Engine 系統預存程序中的參數的變更。
預存程序 | 參數 | 變更描述 |
---|---|---|
sp_bindefault |
@objname |
大小已從 nvarchar(517) 變更為 nvarchar(776)。 |
sp_bindrule |
@objname |
大小已從 nvarchar(517) 變更為 nvarchar(776)。 |
sp_changeobjectowner |
@objname |
大小已從 nvarchar(517) 變更為 nvarchar(776)。 |
sp_detach_db |
@keepfulltextindexfile |
大小已從 nvarchar(517) 變更為 nvarchar(776)。 |
sp_fulltext_service |
@action |
大小已從 varchar(20) 變更為 nvarchar(100)。 |
sp_fulltext_service |
@value |
資料類型已從 int 變更為 sql_variant。 |
sp_getapplock |
@DbPrincipal |
已加入參數。 |
sp_releaseapplock |
@DbPrincipal |
已加入參數。 |
sp_setapprole |
@fCreateCookie |
已加入參數。 |
sp_setapprole |
@cookie |
已加入參數。 |
sp_settriggerorder |
@stmttype |
大小已從 varchar(10) 變更為 varchar(50)。 |
sp_settriggerorder |
@namespace |
已加入參數。 |
sp_sproc_columns |
@fUsePattern |
已加入參數。 |
sp_stored_procedures |
@fUsePattern |
已加入參數。 |
sp_table_privileges |
@fUsePattern |
已加入參數。 |
sp_table_privileges_ex |
@fUsePattern |
已加入參數。 |
sp_tables |
@fUsePattern |
已加入參數。 |
sp_tables_ex |
@fUsePattern |
已加入參數。 |
系統資料表和檢視
下表列出系統資料表和檢視之資料行的變更。
系統資料表或檢視 | 資料行 | 變更描述 |
---|---|---|
COLUMNS |
ORDINAL_POSITION |
資料類型已從 smallint 變更為 int。 |
PARAMETERS |
ORDINAL_POSITION |
資料類型已從 smallint 變更為 int。 |
REFERENTIAL_CONSTRAINTS |
MATCH_OPTION |
大小已從 varchar(4) 變更為 varchar(7)。 預設值已從 'NONE' 變更為 'SIMPLE'。 |
REFERENTIAL_CONSTRAINTS |
UPDATE_RULE |
大小已從 varchar(9) 變更為 varchar(11)。 |
REFERENTIAL_CONSTRAINTS |
DELETE_RULE |
大小已從 varchar(9) 變更為 varchar(11)。 |
ROUTINE_COLUMNS |
ORDINAL_POSITION |
資料類型已從 smallint 變更為 int。 |
sysaltfiles |
名稱 |
資料類型已從 nchar(128) 變更為 sysname。 |
sysaltfiles |
filename |
資料類型已從 nchar(260) 變更為 nvarchar(260)。 |
sysconfigures |
config |
資料類型已從 smallint 變更為 int。 |
syscursorcolumns |
data_type_sql |
資料類型已從 smallint 變更為 int。 |
sysfiles |
名稱 |
資料類型已從 nchar(128) 變更為 sysname。 |
sysfiles |
filename |
資料類型已從 nchar(260) 變更為 nvarchar(260)。 |
sysmessages |
severity |
資料類型已從 smallint 變更為 tinyint。 |
sysperfinfo |
cntr_value |
資料類型已從 int 變更為 bigint。 |
sysprocesses |
waittime |
資料類型已從 int 變更為 bigint。 |
sysprocesses |
hostprocess |
大小已從 nchar(8) 變更為 nchar(10)。 |
sysprocesses |
request_id |
已加入資料行。 |
sysprotects |
columns |
大小已從 varbinary(4000) 變更為 varbinary(8000)。 |
sysservers |
srvcollation |
資料類型已從 int 變更為 sysname。 |
sysservers |
nonsqlsub |
已加入資料行。 |
sysoledbusers |
rmtpassword |
只傳回 NULL。 |
sysindexes |
keys |
只傳回 NULL。 |
sysindexes |
statblob |
只傳回 NULL。 |
syscomments |
compressed |
只傳回 0。 |
sysdevices |
size |
只傳回 0。 |
sysobjects |
schema_ver |
只傳回 0。 |
sysremotelogins |
status |
只傳回 0。 |
sysservers |
topologyx |
只傳回 0。 |
sysservers |
topologyy |
只傳回 0。 |
Transact-SQL
功能 | SQL Server 2000 行為 | SQL Server 2005 行為 |
---|---|---|
bcp 公用程式 |
對資料表使用 INSERT 和 SELECT 權限的使用者,可利用下列命令,透過 bcp 公用程式來大量載入資料至該資料表中:
依預設,此命令會在目標資料表上停用 CHECK 條件約束和觸發程序。 |
如果在大量複製處理序期間停用了 CHECK 條件約束和觸發程序,使用者若要執行 bcp 公用程式,必須具有目標資料表的 ALTER、INSERT 和 SELECT 權限。升級到 SQL Server 2005 之後,應用程式中的 bcp 命令會因為權限不足而失敗。可透過下列其中一種方式來處理此問題:
|
內建系統函數 |
內建函數 (例如 NEWID 和 RAND) 的每一個參考會產生不同結果,因為每一個外部查詢參考都會對它評估一次。 |
外部查詢對檢視或衍生資料表的資料行產生多個參考。不過,如果那些資料行是由呼叫函數 (例如 NEWID 和 RAND) 定義,則這些多個參考會造成在檢視或衍生資料表內的每一個實際呼叫,只評估該函數一次。 對子查詢內的這類資料行的多個參考不會造成函數多次評估。這可讓您在子查詢中重複使用這些函數產生的值。 例如,在 SQL Server 2000 中,下列查詢會傳回兩個不同值。在 SQL Server 2005 中,它會傳回單一值。
|
BULK INSERT |
對於代表使用科學記號標記法之數值的字串,BULK INSERT 支援字串到十進位類型轉換。 |
BULK INSERT 所使用的字串到十進位類型轉換,是遵照與 Transact-SQL CONVERT 函數相同的規則。此函數拒絕代表使用科學記號標記法之數值的字串。因此,BULK INSERT 會將這類字串視為無效的值,並報告轉換錯誤。如需詳細資訊,請參閱<BULK INSERT (Transact-SQL)>。 |
datetime 轉換 |
String-to-datetime 轉換是標示為具決定性。不過,這對於下表所列出的樣式並不適用。這些樣式的轉換需視語言設定而定。 下表列出的樣式,其 string-to-datetime 轉換不具決定性。
100 以下的所有樣式 1106
107109
113130
|
1 樣式 20 和 21 例外
SQL Server 2005 將 string-to-datetime 轉換標示為不具決定性。
DBCC CHECKFILEGROUP
如果所指定之檔案群組中的非叢集索引是與另一個檔案群組中的資料表產生關聯,則會檢查另一個檔案群組中的索引和基底資料表。
如果指定檔案群組中的非叢集索引與另一個檔案群組中的資料表相關聯,就不會檢查索引,因為基底資料表無法用來進行驗證。
DBCC SHOW_STATISTICS
DBCC SHOW_STATISTICS 傳回的資料列集不包含 Name 資料行。
DBCC SHOW_STATISTICS 傳回的第一個資料列集包含一個標題為 Name 的額外資料行。此資料行以結果集的第一個資料行出現。如果您有應用程式是按序數位置存取 DBCC SHOW_STATISTICS 傳回的資料行,請將它們修改為按名稱存取資料行。
DROP LOGIN
當您執行 DROP LOGIN 時,如果資料庫使用者對應至登入,則不卸除登入。
當您執行 DROP LOGIN 時,如果資料庫使用者對應至登入,則卸除登入。
計算資料行、CHECK 條件約束和 DEFAULT 條件約束中的運算式
運算式的原始文字 (包括空白) 會保留在目錄中繼資料中。例如,在計算資料行運算式中輸入的 c1 + c2 + 1
,將會顯示為與在 syscomments 系統資料表之 text 資料行中所輸入的內容完全相同。
運算式的原始文字會予以解碼及正規化,並將這項運算的輸出儲存在目錄中繼資料中。解碼運算式的語意與原始文字相同;不過,語法則不一定相同。例如,在計算資料行運算式中輸入的 c1 + c2 + 1
,在 sys.computed_columns 系統目錄檢視的定義資料行中將會顯示為 (([c1]+[c2])+(1))
。
查詢中的運算式
查詢中的不安全運算式不一定產生執行階段例外狀況。
SQL Server 2005 有時候評估查詢中的運算式,其速度比在 SQL Server 2000 中評估它們更快。此行為提供下列重要優點:
- 比對計算資料行的索引與查詢中與計算資料行運算式相同的運算式的能力。
- 防止運算式結果重複計算。
不過,視查詢的本質和資料庫的資料而定,如果查詢包含現有的不安全運算式,SQL Server 2005 可能發生執行階段例外狀況。這些執行階段例外狀況包含下列各項:
- 算術例外狀況:除以零、溢位和反向溢位。
- 轉換失敗,例如缺少有效位數,及嘗試將非數字字串轉換成數字。
- 對於不保證全部為非 Null 的值集的彙總。
這些例外狀況可能不會發生在 SQL Server 2000 使用特定資料的特定應用程式中。不過,因為變更統計資料而改變的查詢計劃可能導致 SQL Server 2000 發生例外狀況。可將查詢修改為包含條件式運算式 (例如 NULLIF 或 CASE),來防止這些執行階段例外狀況。如需詳細資訊,請參閱<進行查詢運算式上錯誤及警告的疑難排解>。
fn_servershareddrives
系統函數 fn_servershareddrives 傳回的資料可由 public 角色的成員檢視。
權限變更:fn_servershareddrives 需要使用者對伺服器具有 VIEW SERVER STATE 權限。
重要事項:
基於回溯相容性,已保留 SQL Server 2000 系統函數。我們建議您改用 sys.dm_io_cluster_shared_drives。
fn_virtualfilestats
系統函數 fn_virtualfilestats 傳回的資料可由 public 角色的成員檢視。
權限變更:fn_virtualfilestats 需要使用者對伺服器具有 VIEW SERVER STATE 權限。
fn_virtualservernodes
系統函數 fn_virtualservernodes 傳回的資料可由 public 角色的成員檢視。
權限變更:fn_virtualservernodes 需要使用者對伺服器具有 VIEW SERVER STATE 權限。
重要事項:
基於回溯相容性,已保留 SQL Server 2000 系統函數。我們建議您改用 sys.dm_os_cluster_nodes。
HOST_ID
HOST_ID 傳回 char(8) 值。
HOST_ID 傳回 char(10) 值。
索引
允許使用 "SQL Server 2005 behavior" 資料行所述的索引。
下列索引在升級處理序期間可能停用,或因為 SQL Server 2005 導入的變更而需要重建:
- 使用 CHECKSUM(some_timestamp_column) 的計算資料行的索引將停用,因為當 Transact-SQL CHECKSUM 函數以 timestamp 資料行做為引數時,該函數的這個行為已變更。
- 在使用土耳其文定序的 nvarchar 或 nchar 資料行中包含字元值 0x3390、0x33ca 或 0x33cb 的索引,可能需要重建,因為這些定序的排序行為已變更。
- 若其中的檢視或計算資料行運算式包含從字串到 datetime 或 smalldatetime 的隱含轉換,或從字串到 datetime 或 smalldatetime 的不具決定性轉換,則計算資料行或檢視上的索引將停用。
對於因為上述前兩個項目的變更而需要重建的索引,請使用下列程序。
檢查 SQL Server 錯誤記錄檔中的警告訊息 3801、3803 或 3804。
對基礎資料表執行 DBCC CHECKTABLE 以確認問題的存在。
如果 DBCC 陳述式的結果指出問題存在,請使用下列其中一個方法來重建索引:
- ALTER INDEX 陳述式搭配 REBUILD 子句
- CREATE INDEX 搭配 DROP_EXISTING 子句
- DBCC DBREINDEX
使用下列陳述式來識別已停用的 FOREIGN KEY 條件約束:
SELECT * FROM sys.foreign_keys WHERE is_disabled=1;
使用 ALTER TABLE CHECK CONSTRAINT 陳述式來啟用 FOREIGN KEY 條件約束。
PRIMARY KEY 和 UNIQUE 條件約束是藉由重建相關聯的索引來啟用。在啟用參考 PRIMARY KEY 或 UNIQUE 條件約束的 FOREIGN KEY 條件約束之前,必須重建此索引。
對於因為上述第三個項目的變更而停用的索引,請使用下列程序。
使用下列陳述式來識別已停用的計算資料行上的索引:
SELECT object_name(i.object_id) AS object_name, i.* FROM sys.indexes AS i JOIN sys.index_columns AS ic ON i.index_id = ic.index_id AND i.object_id = ic.object_id JOIN sys.computed_columns AS cc ON ic.object_id = cc.object_id AND ic.column_id = cc.column_id WHERE i.is_disabled = 1
對於計算資料行索引,請卸除該索引,然後將計算資料行定義變更為使用明確 CONVERT 函數,它有具決定性日期樣式。
對於索引檢視,請卸除該檢視,然後使用有具決定性日期樣式的明確 CONVERT 函數來重新定義它。
對已修改的計算資料行或檢視重新建立索引。
索引
在 SQL Server 2000 Developer、SQL Server 2000 Standard 和 SQL Server 2000 Enterprise 版本中支援平行索引作業。
只有在 SQL Server 2005 Developer 和 SQL Server 2005 Enterprise 版本中才可執行建立、卸除或重建索引的平行索引作業。
從 SQL Server 2000 Standard Edition 升級到 SQL Server 2005 Standard Edition 的使用者應該知道,建立、卸除或重建索引的作業在 SQL Server 2005 Standard Edition 中是以序列方式執行,可能要花更久時間才能完成。
SELECT、INSERT、UPDATE 和 DELETE 陳述式不受影響。它們在 SQL Server 2005 Standard Edition 中為平行操作。
在升級到 SQL Server 2005 Standard Edition 之後,請監視建立、卸除或重建索引的作業。您可能要調整維護指令碼或計劃維護活動,使這些作業有更多時間。
若要執行平行索引作業,請安裝 SQL Server 2005 Enterprise Edition。
ORDER BY 子句
不論是否有限定,ORDER BY 子句中的資料行名稱將解析為選取清單所列出的資料行。
例如,下列查詢執行之後沒有發生錯誤:
USE pubs
SELECT au_fname AS 'FName',
au_lname AS 'LName'
FROM authors a
ORDER BY a.LName
SQL Server 忽略 ORDER BY
子句中的限定詞 a
,並將資料行名稱 LName
解析為選取清單。
限定資料行名稱和別名將解析為 FROM 子句所列出的資料表資料行。如果 order_by_expression 未限定,則它在 SELECT 陳述式所列出的所有資料行之間必須是唯一的。
例如,下列相等查詢會傳回錯誤:
USE AdventureWorks
SELECT FirstName AS 'FName',
LastName AS 'LName'
FROM Person.Contact p
ORDER BY p.LName
SQL Server 不忽略 ORDER BY
子句中的限定詞 p
,並將資料行名稱 LName
解析為 FROM
子句所列出的資料表。但 FROM
子句不認識資料行 LName
是資料表 p
的資料行別名。
SERVERPROPERTY 函數
SERVERPROPERTY 函數中的 ProductVersion 屬性的傳回類型是 varchar。
SERVERPROPERTY 函數中的 ProductVersion 屬性的傳回類型是 nvarchar。
sp_addtype
任何使用者都可以執行 sp_addtype。
使用者必須是 db_ddladmin 或 db_owner 資料庫角色的成員才能執行 sp_addtype。
若要讓使用者能夠建立別名資料類型,必須完成下列其中一項變更:
- 若要使用 sp_addtype,請將使用者加入至 db_ddladmin 或 db_owner 資料庫角色。
- 若要使用 CREATE TYPE 建立別名資料類型,請授與使用者 CREATE TYPE 權限以及使用者對目標結構描述的 ALTER 權限。
sp_altermessage
sp_altermessage 可用來指定系統訊息 (訊息識別碼 < 50000 的訊息) 是否寫入 Windows 應用程式記錄檔中。
sp_altermessage 無法用來變更系統訊息 (訊息識別碼 < 50000 的訊息) 的記錄行為。若要稽核系統訊息,請使用「SQL 追蹤」和使用者錯誤訊息事件類別。如需詳細資訊,請參閱<SQL 追蹤簡介>。
sp_changedbowner
只有系統管理員 (sysadmin) 固定伺服器角色或 db_owner 固定資料庫角色的成員,或是 db_ddladmin 和 db_securityadmin 固定資料庫角色的成員,才能夠執行 sp_changeobjectowner。
可利用 db_ddladmin 和 db_securityadmin 固定資料庫角色中的成員資格執行此預存程序的使用者,也必須被授與對安全性實體的 CONTROL 權限。若目標物件沒有 CONTROL 權限而執行 sp_changeobjectowner 的話,會導致執行失敗並引發下列錯誤訊息:
「訊息 15247,層級 16,狀態 1,Procedure sp_changeobjectowner,行 17
使用者沒有執行這個動作的權限。」
sp_help
sp_help 針對函數傳回一個結果集。
sp_help 針對函數傳回兩個結果集。另一個結果集是針對函數參數。
sysindexes
保留 sys.sysindexes 的目的,是為了與舊版相容。不過,SQL Server 2005 中的變更防止檢視與舊版的 SQL Server 完全相容。
系統中繼資料
public 角色的成員可查詢系統資料表及顯示目錄中的中繼資料。
查詢目錄的使用者只能看到他們所擁有或具有某些權限之物件的中繼資料的資料列,或是因為角色成員資格而有檢視的權限。如需詳細資訊及建議的更正動作,請參閱<中繼資料可見性組態>和<中繼資料可見性疑難排解>。
系統資料表
系統資料表的類型為 'S'。
系統資料表可做為相容性檢視,其類型為 'V'。查詢系統資料表及包含搜尋準則類型 = 'S' 的陳述式將失敗。
將陳述式搜尋準則修改為類型 = 'V'。
或
移轉至新的目錄檢視或動態管理檢視。如需詳細資訊,請參閱<將 SQL Server 2000 系統資料表對應至 SQL Server 2005 系統檢視>。
使用 bcp 大量匯入時的 TABLOCK、BULK INSERT 或 OPENROWSET(BULK...)
若是大量匯入至具有非空白叢集索引的資料表,則會略過 TABLOCK 提示。
若是大量匯入至具有非空白叢集索引的資料表,則 TABLOCK 提示會取得資料表上的 X 鎖定。這個行為可避免以平行方式大量匯入資料。在此狀況下,如果想要執行平行大量匯入,請不要使用 TABLOCK。如需有關以平行方式大量載入的詳細資訊,請參閱<最佳化大量匯入的指導方針>。
觸發程序
只有在觸發程序引發並執行再次引發相同觸發程序的動作時,才會發生觸發程序的直接遞迴。
發生觸發程序之直接遞迴的狀況有下列兩種:
- 觸發程序引發並執行再次引發相同觸發程序的動作。
- 再次呼叫相同觸發程序,但其呼叫時機是在呼叫不同類型的觸發程序 (AFTER 或 INSTEAD OF) 之後。
觸發程序引發並執行會引發另一個相同類型之觸發程序 (AFTER 或 INSTEAD OF) 的動作時,會發生間接遞迴。此第二個觸發程序執行使原始觸發程序再次引發的動作。
如需詳細資訊,請參閱<使用巢狀觸發程序>中的<遞迴觸發程序>一節。
觸發程序
針對本端或分散式之資料分割的檢視發出 UPDATE 或 DELETE 陳述式時,會引發在檢視之基底資料表上所定義的所有 UPDATE 或 DELETE 觸發程序。這些包括不受更新或刪除作業影響之資料表上的觸發程序。
針對資料分割的檢視發出 UPDATE 或 DELETE 陳述式時,只有在定義觸發程序的基底資料表會受更新或刪除作業影響時,才會引發 UPDATE 或 DELETE 觸發程序。如需詳細資訊,請參閱<DML 觸發程序執行>。
UPDATE() 函數
UPDATE() 函數不會偵測 timestamp 資料行的變更。不論是否更新這些資料行,觸發程序主體內的 IF UPDATE() 子句都會傳回 FALSE。
UPDATE() 函數會偵測 timestamp 資料行的變更。對於這些資料行,如果有更新資料行的話,DML 觸發程序主體內的 IF UPDATE() 子句都會傳回 TRUE。
使用者自訂函數
使用者自訂函數不得包含不具決定性內建系統函數。
Transact-SQL 使用者自訂函數可包含大部分不具決定性內建系統函數。如需允許之內建函數的完整清單,請參閱<建立使用者自訂函數 (Database Engine)>。
varchar、nvarchar 和 varbinary 資料類型
當成所計算之資料表資料行定義的零長度字串或二進位值,會建立類型為 varchar(0)、nvarchar(0) 或 varbinary(0) 的資料行。
當成所計算之資料表資料行定義的零長度字串或二進位值,會建立類型為 varchar(1)、nvarchar(1) 或 varbinary(1) 的資料行。這個行為變更只會影響所計算之資料行的資料類型,而不會影響所計算的值。
修改應用程式,而這類應用程式會檢查所計算之資料行資料類型的長度,以產生最小長度為 1 位元組的 varchar 和 varbinary 資料行,以及 2 位元組的 nvarchar 資料行。
虛擬資料表存取
public 角色的 guest 或成員可存取虛擬資料表。
VIEW SERVER STATE 權限和 SELECT 權限是存取虛擬資料表 (例如 sysprocesses) 所需要的。
檢視的 WITH CHECK OPTION
在指定 WITH CHECK OPTION 子句的檢視上以及在遠端資料表建立的檢視上,允許執行插入和更新作業 (即使那些作業已超出檢視的 SELECT 陳述式界限之外)。
在遠端資料來源之資料表所建立的檢視上執行插入和更新作業時,SQL Server 2005 會認可 WITH CHECK OPTION 子句。
如果在遠端資料表上建立的檢視上執行的插入和更新作業因 WITH CHECK OPTION 子句而失敗,但您不想要這個行為,則您可以不要指定 WITH CHECK OPTION 子句,藉此來修改檢視。
如需詳細資訊,請參閱<CREATE VIEW (Transact-SQL)>、<ALTER VIEW (Transact-SQL)>和<透過檢視修改資料>。
xp_cmdshell
在 xp_cmdshell 的執行中發生錯誤時,會引發錯誤訊息,但執行不會終止。
在 xp_cmdshell 的執行中發生錯誤時,會引發錯誤訊息,且執行會終止。
請參閱
參考
SQL Server 2005 中對於 Database Engine 的突破性變更
SQL Server 2005 中已被取代的 Database Engine 功能
SQL Server 2005 中已停止的 Database Engine 功能
其他資源
SQL Server 2005 Database Engine 回溯相容性
sp_dbcmptlevel (Transact-SQL)
說明及資訊
變更歷程記錄
版本 | 歷程記錄 |
---|---|
2006 年 7 月 17 日 |
|
2005 年 12 月 5 日 |
|