2011-09-02 69 views
1

我们如何管理归档过程中没有在SQL Server 2000中编写单独的存储过程 ?一个普通的SQL查询归档超过一张桌子

例如,

  • 有当前DB-学生和员工两个表。
  • 目的是为了对数据进行存档,而此等表

  • student表 - 数据超过1年

  • employee表 - 数据超过2年

日期字段年长在学生表中比较的字段为CreatedDate,员工 的字段为DOJ

另外,我还保留了一个配置表,其中列ConfigtableName, ConfigColumnName , ConfigCutoffdate

a)我该如何编写一个通用查询,以便动态地从配置表中获取名称以及列名称 名称并将数据插入到归档dbs的表中?

事情是这样的....

INSERT INTO <ArchiveDb>.Dbo.<Table name obtained from config table> 
    SELECT * 
FROM <CurrentDb>.Dbo.<Table name obtained from config table> 
WHERE 
     <ConfigColumnName obtained from config table> < <Cutoffdate obtained from config table> 

二)如何管理标识字段设置选项?

三)是否有可能,如果发生在第n次迭代的错误,也可能错误详细保存到一个日志?

+1

通常情况下,我说你正在寻找一个动态的SQL语句,并可能是一个游标,通过配置表进行迭代,并且使用了加内置元表(INFORMATION_SCHEMA.COLUMNS)之一来构建您的插入声明并执行它们。泡泡,冲洗,对Config中的所有表格重复(光标)。但是,只有2桌这是矫枉过正。我只是写入插入语句和硬编码查找该表的截止日期 – billinkc

+0

SQL不是关于神奇的动态语句或减少代码,而是关于基于刚性表定义的类似代码的重复和冗余块。你离开这个越远越复杂,越慢你的代码变得越远。 –

回答

0

构造在存储过程中这样的动态查询的唯一方法是通过使用sp_executesql存储过程。阅读我链接的文档。非常简单。

我不知道我明白你的意思是“身份字段设置选项”,但如果你关心应该有唯一值(PK)的列中的重复值,我建议你禁用唯一索引在归档表中,因为它们用于归档。我不认为在id列中会出现重复值的主要问题,但最重要的是,如果归档表是源表的相同副本,则永远不会出现这种情况。

如果你想赶上在第n次迭代的错误,你将不得不附上每次迭代中的begin tran /提交TRAN块,并检查错误。如果有,您可以登录到您选择的其他表格;如果没有,那么你提交交易。一个例子为Read this(一直向下滚动到Transactions部分)。

+2

如果您正要开始动态SQL路径 - 您必须阅读并摘要[动态SQL的诅咒和祝福](http://www.sommarskog.se/dynamic_sql.html) - 绝对必要读.... –