2009-06-16 54 views
0

我正在寻找一种干净的方式来使用存储过程转发一些演示数据。我想转发的数据是日期类型。由于我的应用程序的性质,我的应用程序中的某些数据只会在数据中的某些日期处于未来时才会显示。我希望这是有道理的。 :S如何使用存储过程转发演示数据日期?

由于我的数据库不断扩大,我想编写一个存储过程,而在我的数据库属于一个演示用户帐户中的所有表基本上转发所有日期。我还会记录演示数据最后转发的日期。显然,存储的proc将在登录演示数据时运行,并且当转换演示数据的最后日期与当前日期之间存在一定的时间差(例如30天)之间的差异时。这样我就不必更改脚本了。

我们的技术部分:

我用这来检索数据库中的所有表:

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中的循环并不理想,但我想尽量减少数据库调用的数量,而不是将其放在服务器端代码上。

我要去沿着错误的道路来解决这个问题?

在此先感谢。

+1

你不知道哪些列需要递增先验?将架构中的每个日期提前30天似乎是个不错的主意。如果有人出现并添加了不应增加的日期列,该怎么办? – 2009-06-16 01:16:57

回答

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 

这将让你的所有日期时间列的列表,它是由名称表一起。

然后我会完成它的方式是有其基础上动态更新串光标,和exec他们有点像:

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子句在数据库中的通用表。但我认为这会让你开始。

在侧面,也许你应该考虑具有可以运行插入满足您的需求日期的新数据的一些测试数据填充脚本。