【问题标题】:How to forward demo data dates using a stored procedure?如何使用存储过程转发演示数据日期?
【发布时间】:2009-06-16 01:13:06
【问题描述】:

我正在寻找一种使用存储过程转发一些演示数据的简洁方法。我要转发的数据是日期类型。由于我的应用程序的性质,我的应用程序中的一些数据只会在数据中的某些日期在未来时才会出现。我希望这是有道理的。 :S

由于我的数据库一直在扩展,我正在考虑编写一个存储过程,该过程基本上转发我的数据库中属于演示用户帐户的所有表中的所有日期。我还将跟踪演示数据上次转发的日期。显然,存储过程将在登录演示数据时运行,并且当演示数据被转发的最后日期与当前日期之间的差异达到一定的时间差时(例如 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')

我需要的是一种遍历表名、查找列名和列类型的方法。然后我希望更新每个表中日期时间类型的所有列。我读过 SQL 中的循环并不理想,但我想尽量减少数据库调用的数量,而不是将其放在服务器端代码中。

我是不是走错了路来解决这个问题?

提前致谢。

【问题讨论】:

  • 不知道哪些列需要先验递增?将架构中的每个日期都提前 30 天似乎是个坏主意。如果有人出现并添加了不应增加的日期列怎么办?
  • 我和 JP 在一起。由于您的数据不断变化,列不能改变吗?另外,您使用的是 MySQL 还是 SQL Server?我相信两者都有关于其内部工作的非常不同的元数据(即 - 如何分辨什么是日期时间字段)。

标签: sql mysql sql-server sql-server-2005


【解决方案1】:

我同意这样的评论,即以隐藏的方式自动执行此操作可能不是一个好主意,但如果您愿意,您可以使用它。

(注意这里假设 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 子句。但我认为这会让你开始。

另一方面,也许您应该考虑使用一些测试数据填充脚本,您可以运行该脚本来插入满足您的日期要求的新数据。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-10-24
    • 2017-10-30
    • 2015-07-14
    • 1970-01-01
    • 1970-01-01
    • 2014-09-07
    • 1970-01-01
    相关资源
    最近更新 更多