Sql-Server

T-SQL 的 RowNum(不是 TOP #)

  • December 11, 2020

試圖執行更新,但我想逐步完成它,因為它是相當多的數據,不想一下子全部爆炸。

在 oracle 中選擇我想要的行要容易一些,因為您可以將其包含在WHERE子句中,但 T-SQL 您將其包含在select. 我想按照以下方式寫一些東西:

Update Instances
set thing = 'new thing'
Where rownum<500

基本上想一次做500個,這種語法在TSQL中可以嗎?

您可以使用SET ROWCOUNT xxx來限制受更新語句影響的行數。

像這樣的東西:

SET ROWCOUNT 500;

WHILE EXISTS (SELECT 1 FROM Instances WHERE thing = 'new thing')
BEGIN
   BEGIN TRANSACTION;
   UPDATE Instances
   SET thing = 'new thing'
   WHERE thing <> 'new thing';
   COMMIT TRANSACTION;
   CHECKPOINT;
   WAITFOR DELAY '00:00:01'; --wait one second between loops
END

如果您的數據庫配置為簡單恢復模式,這將不需要大量的日誌空間。但是,如果您的數據庫處於完全恢復模式,您可能希望在此過程中定期進行日誌備份。

Microsoft Docs建議SET ROWCOUNT它是一個已棄用的設置:

使用 SET ROWCOUNT 不會影響 SQL Server 未來版本中的 DELETE、INSERT 和 UPDATE 語句。避免在新的開發工作中將 SET ROWCOUNT 與 DELETE、INSERT 和 UPDATE 語句一起使用,併計劃修改目前使用它的應用程序。對於類似的行為,請使用 TOP 語法。

話雖如此,目前它不在已刪除功能的列表中。

引用自:https://dba.stackexchange.com/questions/169372