Tsql SQL Server编程-按给定天数更新所有日期

Tsql SQL Server编程-按给定天数更新所有日期,tsql,smalldatetime,Tsql,Smalldatetime,我有一个演示数据库,里面有几百个表。每个表通常至少有一个名为tstamp的字段,它是smalldatetime数据类型。有些表也有其他日期字段。许多表上也有一个或多个触发器 我用艰难的方式编写了一个脚本,如下所示,将每个表中的日期字段增加给定的天数。其想法是通过将所有日期更新相同的天数,使数据看起来更为最新 我相信有一种更简单的方法可以做到这一点,方法是在系统表上循环以标识数据库中的每个用户表,禁用其中的所有触发器,通过向每个smalldatetime字段添加天数来修改每个smalldateti

我有一个演示数据库,里面有几百个表。每个表通常至少有一个名为tstamp的字段,它是smalldatetime数据类型。有些表也有其他日期字段。许多表上也有一个或多个触发器

我用艰难的方式编写了一个脚本,如下所示,将每个表中的日期字段增加给定的天数。其想法是通过将所有日期更新相同的天数,使数据看起来更为最新

我相信有一种更简单的方法可以做到这一点,方法是在系统表上循环以标识数据库中的每个用户表,禁用其中的所有触发器,通过向每个smalldatetime字段添加天数来修改每个smalldatetime字段,重新启用触发器并移动到下一个表。我只是不知道如何编写这样的T-SQL

有人要吗

谢谢。 乔

示例脚本:

DECLARE @numDaysToAdd int

SET @numDaysToAdd = 100

ALTER TABLE someTableDISABLE TRIGGER someTrigger

UPDATE someTable
SET tstamp = DATEADD(day, @numDaysToAdd, tstamp)

-- update any other smalldatetime field in the table too.

ALTER TABLE someTable ENABLE TRIGGER someTrigger

-- same pattern for 200 more tables!
========================================================================================== 忽略触发器问题,下面是一个有效的脚本:

声明@numDaysToAdd int

设置@numDaysToAdd=1

如果@numDaysToAdd>0

开始

声明@tablename varchar100

声明@currtable varchar100

声明@currcolumn varchar100

声明@columnname varchar100

声明@strsqlnvarch4000

声明tnames\u游标

为了

选择t.表格名称,c.列名称

从INFORMATION\u SCHEMA.COLUMNS c在t.TABLE\u NAME=c.TABLE\u NAME上连接INFORMATION\u SCHEMA.TABLES t

其中c.DATA\u TYPE='smalldatetime'或c.DATA\u TYPE='datetime'和t.TABLE\u TYPE'VIEW'

按t.表格名称、c.列名称描述排序

打开tnames\u光标

从tnames_游标获取下一个到@tablename、@columnname

设置@currcolumn=@columnname

设置@currtable=@tablename

BEGIN     

  IF @currcolumn <> @columnname

    SET @strSQL = @strSQL + N',' + CHAR(13)+CHAR(10) + @columnname + ' = DATEADD(day, ' + CONVERT(varchar(10),@numDaysToAdd) + ', ' + @columnname + ')'
END
SET@strSQL=N'UPDATE'+@tablename+CHAR13+CHAR10+'SET'+@columnname+'=DATEADDday'+CONVERTvarchar10、@numDaysToAdd+'、'+@columnname+

而@@FETCH\u STATUS=0

开始

如果@currtable=@tablename

BEGIN     

  IF @currcolumn <> @columnname

    SET @strSQL = @strSQL + N',' + CHAR(13)+CHAR(10) + @columnname + ' = DATEADD(day, ' + CONVERT(varchar(10),@numDaysToAdd) + ', ' + @columnname + ')'
END
从tnames_游标获取下一个到@tablename、@columnname

结束

-运行最终语句 EXEC sp_executesql@strSQL

关闭tnames_光标

取消分配tnames\u光标


结束

您的理解是正确的。听起来你缺少的部分是:

如何查找元数据哪些表 你有什么专栏 如何构建SQL以遍历 桌子。 对于1,请参阅系统视图信息\u SCHEMA.TABLES和信息\u SCHEMA.COLUMNS:


对于2,您可以将SQL语句构建为字符串,遍历您感兴趣的表,然后使用sp_executesql执行它。

我同意。另一个选项是使用系统表为所有200个表生成sql。然后可以使用sp_execsql执行。不会更改执行,但会节省键入时间,这一点始终很重要:

以下查询将为您提供“smallDateTime”类型的用户表及其列的列表

SELECT sys.columns.name as tableName, sys.tables.name as columnName from sys.columns,sys.tables 
where sys.columns.object_id=sys.tables.object_id and sys.columns.system_type_id=58 order by tableName
这里58是数据类型smallDateTime的系统类型id。您可以从sys.types表中进行验证

使用游标可能是您可以迭代结果集以获得每个表,然后禁用该表上的触发器。检查此项以禁用/启用触发器

然后继续更新结果集中与每个表相关的每一列,然后启用触发器

干杯

SELECT sys.columns.name as tableName, sys.tables.name as columnName from sys.columns,sys.tables 
where sys.columns.object_id=sys.tables.object_id and sys.columns.system_type_id=58 order by tableName