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