For 1 million rows, you can simply do this (it should be done in about one minute):
UPDATE YourTable SET ColumnName=DATEADD(HOUR,1,ColumnName)
For more rows, you can do it in batches of 10000 rows (or 100000 rows), but you need an additional column to keep track of what you already updated.
If you already have an int
column in the table (for example an IDENTITY column), you can do something like this (in AdventureWorks):
DECLARE @x INT=(
SELECT MIN(SalesOrderDetailID/10000)
FROM Sales.SalesOrderDetail
)
WHILE EXISTS (
SELECT * FROM Sales.SalesOrderDetail
WHERE SalesOrderDetailID/10000>=@x
) BEGIN
UPDATE Sales.SalesOrderDetail
SET ModifiedDate=DATEADD(HOUR,1,ModifiedDate)
WHERE SalesOrderDetailID/10000=@x
SET @x=@x+1
END
If you may add an additional column, you can also do something like this:
ALTER TABLE Sales.SalesOrderDetail ADD WasUpdated BIT NOT NULL
CONSTRAINT DF_SalesOrderDetail_WasUpdated DEFAULT (0)
GO
WHILE 1=1 BEGIN
UPDATE TOP (10000) Sales.SalesOrderDetail
SET ModifiedDate=DATEADD(HOUR,1,ModifiedDate), WasUpdated=1
WHERE WasUpdated=0
IF @@ROWCOUNT=0 BREAK
END
GO
ALTER TABLE Sales.SalesOrderDetail DROP CONSTRAINT DF_SalesOrderDetail_WasUpdated
ALTER TABLE Sales.SalesOrderDetail DROP COLUMN WasUpdated