我有一个演示数据库,里面有几百个表。每个表通常至少有一个名为 tstamp 的字段,它是一种 smalldatetime 数据类型。有些表也有其他日期字段。许多表上也有 1 个或多个触发器。
我编写了一个脚本(困难的方法 - 见下文)将每个表中的日期字段增加给定的天数。这个想法是通过将所有日期更新相同的天数来使数据看起来更“最新”。
我确信有一种更简单的方法可以通过循环遍历系统表来识别数据库中的每个用户表,禁用其上的所有触发器,通过添加天数来修改每个 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 整数
设置@numDaysToAdd = 1
如果@numDaysToAdd > 0
开始
声明 @tablename varchar(100)
声明 @currtable varchar(100)
声明@currcolumn varchar(100)
声明 @columnname varchar(100)
声明 @strSQL nvarchar(4000)
声明 tnames_cursor CURSOR
为了
选择 t.TABLE_NAME,c.COLUMN_NAME
FROM INFORMATION_SCHEMA.COLUMNS c 加入 INFORMATION_SCHEMA.TABLES t ON t.TABLE_NAME = c.TABLE_NAME
WHERE (c.DATA_TYPE = 'smalldatetime' OR c.DATA_TYPE = 'datetime') AND t.TABLE_TYPE<>'VIEW'
按 t.TABLE_NAME、c.COLUMN_NAME DESC 排序
打开 tnames_cursor
FETCH NEXT FROM tnames_cursor INTO @tablename, @columnname
SET @currcolumn = @columnname
SET @currtable = @tablename
SET @strSQL = N'UPDATE' + @tablename + CHAR(13)+CHAR(10) + 'SET' + @columnname + ' = DATEADD(day, ' + CONVERT(varchar(10),@numDaysToAdd) + ', ' + @列名 + ')'
同时(@@FETCH_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
别的
BEGIN
SET @currtable = @tablename
SET @currcolumn = @columnname
EXEC sp_executesql @strSQL
SET @strSQL = N'UPDATE ' + @tablename + CHAR(13)+CHAR(10) + 'SET ' + @columnname + ' = DATEADD(day, ' + CONVERT(varchar(10),@numDaysToAdd) + ', ' + @columnname + ')'
END
FETCH NEXT FROM tnames_cursor INTO @tablename, @columnname
结尾
--运行最终语句 EXEC sp_executesql @strSQL
关闭 tnames_cursor
DEALLOCATE tnames_cursor
结尾