我正在寻找一种使用存储过程转发一些演示数据的简洁方法。我要转发的数据是日期类型。由于我的应用程序的性质,我的应用程序中的某些数据仅在数据中的某些日期将来出现时才会显示。我希望这是有道理的。 :S
由于我的数据库不断扩展,我正在考虑编写一个存储过程,它基本上转发数据库中属于演示用户帐户的所有表中的所有日期。我还将跟踪最后转发演示数据的日期。显然,存储过程将在登录演示数据时运行,并且当转发演示数据的最后日期与当前日期之间的差异达到一定时间差(例如30天)时。这样我就不必一直改变脚本了。
现在到技术部分:
我使用它来检索db中的所有表:
Select
table_name
from
Information_Schema.Tables
Where
TABLE_TYPE like 'BASE TABLE'
and table_name not like 'Report_%'
and table_name not in ('Accounts', 'Manifest', 'System', 'Users')
我需要的是迭代表名,查找列名和列类型的方法。然后我希望更新每个表中datetime类型的所有列。我在SQL中读取循环并不理想,但我希望尽量减少数据库调用的数量,而不是将其放在服务器端代码上。
我是否走错了路来解决这个问题?
提前致谢。
答案 0 :(得分:0)
我同意评论说,以隐藏方式自动执行此操作可能不是一个好主意,但如果您愿意,可以使用此功能。
(注意这是假设SQL Server)
select T.Name, C.Name
from sys.tables T
join sys.columns C
on T.object_id = C.object_id
and C.system_type_id = 61 -- I would do a little researcht o make sure 61 is all you need to return here
这将为您提供所有日期时间列的列表,以及它按名称列出的表。
然后我要完成它的方法是有一个游标,可以动态构建更新字符串,并执行它们有点像:
DECLARE @UpdateString varchar(500)
DECLARE @DaysToAdd int
DECLARE @TableName VARCHAR(100)
DECLARE @ColumnName VARCHAR(100)
set @DaysToAdd = 10
DECLARE db_cursor CURSOR FOR
select T.Name, C.Name
from sys.tables T
join sys.columns C
on T.object_id = C.object_id
and C.system_type_id = 61
OPEN db_cursor
FETCH NEXT FROM db_cursor INTO @TableName, @ColumnName
WHILE @@FETCH_STATUS = 0
BEGIN
set @UpdateString = 'Update ' + @TableName + ' set ' + @ColumnName + ' = dateadd(dd, ' + cast(@DaysToAdd as varchar) + ', ' + @ColumnName + ') where ...'
exec(@UpdateString)
FETCH NEXT FROM db_cursor INTO @TableName, @ColumnName
END
CLOSE db_cursor
DEALLOCATE db_cursor
有很多我不喜欢的事情,光标,它在幕后的事实,以及exec调用,以及我不确定你将如何“仅更新测试数据”,因为它将是很难为数据库中的通用表编写where子句。但我认为这会让你开始。
另一方面,您可以考虑使用一些测试数据填充脚本,您可以运行该脚本来插入满足日期要求的新数据。