3

我有一个托管我的应用程序的服务器。该应用程序正在运行。昨天我意识到服务器日期晚了一天。

DateTime如何通过为每条记录添加一天来更改服务器日期以及更新数据库中的所有列?

4

2 回答 2

7

运行以下 SQL 语句:

select 'update '+so.name+' set '+sc.name+' = dateadd(day,1,'+sc.name+')'
from sysobjects so
inner join syscolumns sc 
on so.id = sc.id
where sc.xtype = 61
and so.type = 'u'

并将结果复制并粘贴到查询窗口中并执行。

update Status set CreatedDate = dateadd(day,1,CreatedDate)
update Status set DateUpdated = dateadd(day,1,DateUpdated)
update TxSession set SessionDate = dateadd(day,1,SessionDate)
update TxSession set CreatedDate = dateadd(day,1,CreatedDate)
update TxSession set LastModifiedDate = dateadd(day,1,LastModifiedDate)
于 2013-05-21T13:08:28.040 回答
2

为了将来参考,在编写动态 SQL 来完成此类工作时要记住的最重要的事情是:

  • 始终包含您的架构。你不知道所有的对象都是 dbo。
  • 更重要的是始终将 [] 放在名称周围。在很多情况下,我的动态 SQL 都死了,因为表的名称以数字或符号开头。

我知道我使用了一个光标(糟糕的肯,糟糕的),但在这种情况下,它似乎是合适的。当然,您可以只运行查询并将输出复制并粘贴到新的查询窗口。这样可能更容易。

DECLARE UpdateCur
FOR 
    SELECT 'UPDATE ['+tabs.TABLE_SCHEMA+'].['+tabs.TABLE_NAME+'] ' + 
        'SET ['+cols.COLUMN_NAME+'] = DATEADD(dd,1,['+cols.COLUMN_NAME+']);'
    FROM INFORMATION_SCHEMA.COLUMNS cols
    JOIN INFORMATION_SCHEMA.TABLES tabs
        ON cols.TABLE_NAME = tabs.TABLE_NAME
    WHERE tabs.TABLE_TYPE = 'BASE TABLE' -- Exclude views
    -- Include datatypes DATE, DATETIME, DATETIME2, DATETIMEOFFSET
      AND cols.DATA_TYPE LIKE 'DATE%' 


DECLARE @sql nvarchar(max)
OPEN UpdateCur

FETCH NEXT FROM UpdateCur INTO @sql
WHILE (@@fetch_status <> -1)
BEGIN
    IF (@@fetch_status <> -2)
    BEGIN
        EXEC sp_executeSQL @sql
    END
    FETCH NEXT FROM UpdateCur INTO @sql
END

CLOSE UpdateCur
DEALLOCATE UpdateCur
GO
于 2013-05-21T13:34:56.880 回答