Share via


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 資料指標結果集包含 textntextimage 資料行。

向前快轉

動態

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 參數。

權限不是在每一個資料庫的資料和記錄檔上設定的。

每當做業套用至資料庫時,權限會在資料和記錄檔上設定:

已建立修改以加入新檔案
已附加已備份
已卸離已還原

檔案所在目錄如有開放權限,這個權限可防止檔案遭到竄改。如需詳細資訊,請參閱<保護資料和記錄檔>。

ms143359.note(zh-tw,SQL.90).gif附註:

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 2000 授與的權限才會授與使用者。
  • 您會收到下列訊息:「ALL 權限已被取代,只保留相容性。此權限不代表實體上定義的 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 公用程式來大量載入資料至該資料表中:

bcp <target table> in 
<datafile> -c -T

依預設,此命令會在目標資料表上停用 CHECK 條件約束和觸發程序。

如果在大量複製處理序期間停用了 CHECK 條件約束和觸發程序,使用者若要執行 bcp 公用程式,必須具有目標資料表的 ALTER、INSERT 和 SELECT 權限。升級到 SQL Server 2005 之後,應用程式中的 bcp 命令會因為權限不足而失敗。可透過下列其中一種方式來處理此問題:

  • 授與使用者對 bcp 處理序所影響之所有資料表的 ALTER TABLE 權限。
  • 修改 bcp 命令,以明確強制執行 CHECK 條件約束和觸發程序,如下列命令所示:

    bcp <target table> 
    in <datafile> -c -T -h 
    "CHECK_CONSTRAINTS, 
    FIRE_TRIGGERS"

內建系統函數

內建函數 (例如 NEWID 和 RAND) 的每一個參考會產生不同結果,因為每一個外部查詢參考都會對它評估一次。

外部查詢對檢視或衍生資料表的資料行產生多個參考。不過,如果那些資料行是由呼叫函數 (例如 NEWID 和 RAND) 定義,則這些多個參考會造成在檢視或衍生資料表內的每一個實際呼叫,只評估該函數一次。

對子查詢內的這類資料行的多個參考不會造成函數多次評估。這可讓您在子查詢中重複使用這些函數產生的值。

例如,在 SQL Server 2000 中,下列查詢會傳回兩個不同值。在 SQL Server 2005 中,它會傳回單一值。

SELECT Column1, Column1
      FROM (
            SELECT RAND() Column1
            FROM (
            SELECT 1 c
            UNION
            SELECT 2 c
                  ) s
            ) t

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 權限。

ms143359.note(zh-tw,SQL.90).gif重要事項:

基於回溯相容性,已保留 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 權限。

ms143359.note(zh-tw,SQL.90).gif重要事項:

基於回溯相容性,已保留 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 資料行做為引數時,該函數的這個行為已變更。
  • 在使用土耳其文定序的 nvarcharnchar 資料行中包含字元值 0x3390、0x33ca 或 0x33cb 的索引,可能需要重建,因為這些定序的排序行為已變更。
  • 若其中的檢視或計算資料行運算式包含從字串到 datetimesmalldatetime 的隱含轉換,或從字串到 datetimesmalldatetime 的不具決定性轉換,則計算資料行或檢視上的索引將停用。

對於因為上述前兩個項目的變更而需要重建的索引,請使用下列程序。

  1. 檢查 SQL Server 錯誤記錄檔中的警告訊息 3801、3803 或 3804。

  2. 對基礎資料表執行 DBCC CHECKTABLE 以確認問題的存在。

  3. 如果 DBCC 陳述式的結果指出問題存在,請使用下列其中一個方法來重建索引:

    • ALTER INDEX 陳述式搭配 REBUILD 子句
    • CREATE INDEX 搭配 DROP_EXISTING 子句
    • DBCC DBREINDEX
  4. 使用下列陳述式來識別已停用的 FOREIGN KEY 條件約束:

    SELECT * FROM sys.foreign_keys 
    WHERE is_disabled=1;
    
  5. 使用 ALTER TABLE CHECK CONSTRAINT 陳述式來啟用 FOREIGN KEY 條件約束。
    PRIMARY KEY 和 UNIQUE 條件約束是藉由重建相關聯的索引來啟用。在啟用參考 PRIMARY KEY 或 UNIQUE 條件約束的 FOREIGN KEY 條件約束之前,必須重建此索引。

對於因為上述第三個項目的變更而停用的索引,請使用下列程序。

  1. 使用下列陳述式來識別已停用的計算資料行上的索引:

    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
    
  2. 對於計算資料行索引,請卸除該索引,然後將計算資料行定義變更為使用明確 CONVERT 函數,它有具決定性日期樣式。

  3. 對於索引檢視,請卸除該檢視,然後使用有具決定性日期樣式的明確 CONVERT 函數來重新定義它。

  4. 對已修改的計算資料行或檢視重新建立索引。

索引

在 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_ddladmindb_owner 資料庫角色的成員才能執行 sp_addtype

若要讓使用者能夠建立別名資料類型,必須完成下列其中一項變更:

  • 若要使用 sp_addtype,請將使用者加入至 db_ddladmindb_owner 資料庫角色。
  • 若要使用 CREATE TYPE 建立別名資料類型,請授與使用者 CREATE TYPE 權限以及使用者對目標結構描述的 ALTER 權限。

sp_altermessage

sp_altermessage 可用來指定系統訊息 (訊息識別碼 < 50000 的訊息) 是否寫入 Windows 應用程式記錄檔中。

sp_altermessage 無法用來變更系統訊息 (訊息識別碼 < 50000 的訊息) 的記錄行為。若要稽核系統訊息,請使用「SQL 追蹤」和使用者錯誤訊息事件類別。如需詳細資訊,請參閱<SQL 追蹤簡介>。

sp_changedbowner

只有系統管理員 (sysadmin) 固定伺服器角色或 db_owner 固定資料庫角色的成員,或是 db_ddladmindb_securityadmin 固定資料庫角色的成員,才能夠執行 sp_changeobjectowner

可利用 db_ddladmindb_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)>。

varcharnvarcharvarbinary 資料類型

當成所計算之資料表資料行定義的零長度字串或二進位值,會建立類型為 varchar(0)nvarchar(0)varbinary(0) 的資料行。

當成所計算之資料表資料行定義的零長度字串或二進位值,會建立類型為 varchar(1)nvarchar(1)varbinary(1) 的資料行。這個行為變更只會影響所計算之資料行的資料類型,而不會影響所計算的值。

修改應用程式,而這類應用程式會檢查所計算之資料行資料類型的長度,以產生最小長度為 1 位元組的 varcharvarbinary 資料行,以及 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)

說明及資訊

取得 SQL Server 2005 協助

變更歷程記錄

版本 歷程記錄

2006 年 7 月 17 日

新增內容:
  • 在列出 Transact-SQL 行為變更的表格中,新增「計算資料行、CHECK 條件約束和 DEFAULT 條件約束中的運算式」項目。
  • 在列出 Transact-SQL 行為變更之表格的「SQL Server 2005 行為」一欄中,變更「varcharnvarcharvarbinary 資料類型」項目的說明。計算資料表資料行的資料類型已從 nvarchar(2) 變更為 nvarchar(1)

2005 年 12 月 5 日

新增內容:
  • 新增有關無效資料指標宣告的資訊。
  • 新增「變更 sa 帳戶的預設語言」內容。
  • 新增 "DBCC CHECKFILEGROUP" 內容。
  • 新增「大量匯入時的 TABLOCK」內容。
  • 新增「觸發程序」內容。
變更的內容:
  • 更正了「varcharnvarcharvarbinary 資料類型」中的內容。