徵狀
請試想下列案例:
-
在 Microsoft SQL Server 2008 或 SQL Server 2008 R2 中,您可以使用下列其中一個查詢,將多個列插入到表格中:
-
INSERT INTO <target_table> SELECT * FROM <target_table> WHERE <predicate>
-
SELECT * INTO <target_table> FROM <source_table> WHERE <predicate>
注意事項
-
<target_table>預留位置代表實際的目標資料表名稱。
-
<謂語>預留位置代表實際的謂語。
-
<source_table>預留位置代表實際的來來源資料表。
-
-
超過資料表的鎖升級閾值。
在這種情況下,資料庫引擎不會升級資料表的鎖。
原因
之所以發生這個問題,是因為 SQL Server 不會在內部計算由 INSERT 操作產生的所有新鎖定。 因此,可能不會在需要時觸發鎖定升級閥值。
解決方案
SQL Server 2008 的 Service pack 資訊
若要解決此問題,請取得最新的 SQL Server 2008 service pack。如需詳細資訊,請按一下下列文章編號,以查看 Microsoft 知識庫中的文章:
968382 如何取得最新的 SQL Server service pack 2008
SQL Server 2008 R2 的 Service pack 資訊
若要解決此問題,請取得最新的 SQL Server 2008 R2 service pack。如需詳細資訊,請按一下下列文章編號,以查看 Microsoft 知識庫中的文章:
2527041如何取得最新的 SQL Server 2008 R2 service pack
狀態
Microsoft 已確認本篇文章<適用於>一節所列之 Microsoft 產品確實有上述問題。這個問題第一次在 sql server 2008 Service Pack 2 的 sql server 2008 中修正。這個問題首先在 sql server 2008 R2 Service Pack 1 for SQL Server 2008 R2 中修正。
其他相關資訊
如需鎖定升級的詳細資訊,請造訪下列 Microsoft TechNet 網站:
關於鎖升級的一般資訊若要判斷是否已升級資料表的鎖,請執行下列 Transact-sql 語句:
USE tempdbGOCREATE TABLE x (i INT NOT NULL PRIMARY KEY)GOBEGIN TRANINSERT xSELECT TOP (40000)ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) AS rFROM master..spt_values a, master..spt_values bORDER BYrSELECTCOUNT(*)FROM sys.dm_tran_locksWHERE request_session_id = @@SPID ROLLBACKGODROP TABLE x
如果資料表的鎖已升級,則最後一個 SELECT 語句會傳回 1 或 2的值。 如果沒有升級資料表的鎖,最後一個 SELECT 語句就會傳回 40066 或 40067的值。