你能怎么做呢?
您可以尝试使用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