你能怎麼做呢?
您可以嘗試使用WITH(NOLOCK)table hint運行單獨的查詢來查看已更新了多少行。 例如如果更新語句是:
UPDATE MyTable
SET MyField = 'UPDATEDVALUE'
WHERE ID BETWEEN 1 AND 10000000
你可以運行這個命令:
SELECT COUNT(*)
FROM MyTable WITH (NOLOCK)
WHERE ID BETWEEN 1 AND 10000000
AND MyField = 'UPDATEDVALUE'
你能在將來做什麼?
你可以批量更新,並輸出進度。例如使用一個循環來更新1000中說明的塊的記錄(解釋點的任意值)。在每個更新塊完成後,打印出進度(假設你正在從SSMS運行)例如
DECLARE @RowCount INTEGER
SET @RowCount = 1
DECLARE @Message VARCHAR(500)
DECLARE @TotalRowsUpdated INTEGER
SET @TotalRowsUpdated = 0
WHILE (@RowCount > 0)
BEGIN
UPDATE TOP (1000) MyTable
SET MyField = 'UPDATEDVALUE'
WHERE ID BETWEEN 1 AND 10000000
AND MyField <> 'UPDATEDVALUE'
SELECT @RowCount = @@ROWCOUNT
SET @TotalRowsUpdated = @TotalRowsUpdated + @RowCount
SELECT @Message = CAST(GETDATE() AS VARCHAR) + ' : ' + CAST(@TotalRowsUpdated AS VARCHAR) + ' records updated in total'
RAISERROR (@Message, 0, 1) WITH NOWAIT
END
這樣使用RAISERROR可以確保立即打印出進度信息。如果您使用PRINT,則會將郵件假脫機並不立即輸出,因此您無法看到實時進度。
表提示WITH(NOLOCK)爲我工作。由於我是sql server上的初學者,所以我不知道這一點,所以在另一個運行時我無法執行單獨的查詢。非常感謝你。順便說一下,我對第二種解決方案有疑問。如果ID和MyField不是索引列,while循環的運行速度是否比單個更新查詢慢?也就是說,例如,在第五回閤中,它是否掃描4000行的表以找出MyField <>'UPDATEDVALUE'或緩存使它像單個更新查詢一樣快速? – Ahmet 2010-02-02 05:29:08