Applies ToSQL Server 2008 Service Pack 4 SQL Server 2008 R2 Service Pack 3

徵狀

請試想下列案例:

  • 在 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 語句會傳回 12的值。 如果沒有升級資料表的鎖,最後一個 SELECT 語句就會傳回 4006640067的值。

Need more help?

Want more options?

探索訂閱權益、瀏覽訓練課程、瞭解如何保護您的裝置等等。

社群可協助您詢問並回答問題、提供意見反應,以及聆聽來自具有豐富知識的專家意見。