基本上,我是新的IT类型的人,老家伙给我留下了一个右边的烂摊子!我们有一个MS-Access数据库来存储在线调查问卷的答案,这个数据库大约有45000条记录,每个调查问卷有220个问题。这位老人明智地决定将问卷问题的答案存储为文本,即使答案是0-5个整数!
无论如何,我们现在需要向问卷中添加大量新问题,使其达到240个问题。255个字段的访问限制和30多列的传记数据也存储在这个数据库中,这意味着我需要拆分数据库。
因此,我很高兴地将所有的bioinfo放到了一个新的表中,如下所示:
SELECT id,[all bio column names] INTO resultsBioData FROM results;这没有造成太大的问题,因为我没有强制转换任何内容,但是对于问题数据,我想将其全部转换为整数,目前我有:
SELECT id,CInt(q1) AS nq1.......CInt(q220) AS nq220 INTO resultsItemData FROM results;这对大约400条记录似乎工作得很好,但随后就停止了,我想这可能是因为它遇到了一些它不能一开始就转换成整数的东西,所以我写了一个小java程序,删除了220个答案中任何一个不是0、1、2、3、4或5的记录,但它仍然放弃了大约400条记录(但永远不是相同的记录!)
有人有什么想法吗?我目前正在我的测试系统上做这件事,在我对我们的实时系统做这件事之前,我真的想要一些健壮的东西!
很抱歉这个长篇大论的问题,但它让我头疼!
发布于 2011-10-12 01:52:36
我不确定您是在谈论在Access中还是在SQL Server中进行数据转换。无论采用哪种方式,既然您正在重新设计模式,那么现在是时候考虑是否真的希望resultsItemData表包含200+字段,从nq1到nq220 (或者最终是nq240)。而且,将来添加的任何问题都需要再次更改表结构。
经验法则是“列是昂贵的;行是廉价的”。无论表是在Access中还是在SQL Server中,这都适用。
考虑每个id/问题组合一行。
id q_number answer
1 nq1 3
1 nq2 1我不明白为什么您当前的方法在400行时崩溃。不过,我甚至不会担心这一点,除非你确定你有最优的表设计。
编辑表:由于您坚持使用您所描述的方法,我想知道它是否适用于“追加”查询而不是"make “查询。创建resultsItemData表结构,并附加查询,将QX值转换为数值。
INSERT INTO resultsItemData (id, nq1, nq2, ... nq220)
SELECT id, CInt(q1), CInt(q2), ... CInt(q220) FROM results;发布于 2011-10-12 01:10:50
尝试此解决方案:
select * into #tmp from bad_table
truncate table bad_table
alter bad_table alter column silly_column int
insert bad_table
select cast(silly_column as int), other_columns
from #tmp
drop table #tmp发布于 2011-10-18 23:30:05
最后,我编写了一个小的java程序,创建了新的表,并逐个遍历每个记录,将字段转换为整数,这需要大约一个半小时来完成整个过程,所以当我使用实时系统来做这件事时,我仍然在寻找一个更好的解决方案。
https://stackoverflow.com/questions/7729370
复制相似问题