2010-10-08 55 views
8

我有两个具有相同结构和很大数量的字段(约1000)的表。我需要执行2个操作 1)从第二个表中插入所有行到拳头。例如:如何从另一个表更新一个表而不指定列名?

INSERT INTO [1607348182] 
SELECT * 
FROM _tmp_1607348182; 

2)从第二表 更新第一表但是对于更新我不能找到适当的更新SQL语法。

查询:

Update [1607348182] 
set [1607348182].* = tmp.* 
from [1607348182] 
inner join _tmp_1607348182 as tmp on tmp.recordid = [1607348182].recordid 

Update [1607348182] 
from [1607348182] 
inner join _tmp_1607348182 as tmp on tmp.recordid = [1607348182].recordid 

无效。

+3

我会推荐使用'TRIGGER'或修改您的模式,以便您不必这样做。 – 2010-10-08 14:59:50

+0

我不明白。第一次更新后,两个表格将包含相同的行,那么你希望第二次更新会做什么? – PaulG 2010-10-08 15:04:22

+0

Travis G,我同意你修改数据库模式,但不幸的是我应该在我的项目中遵循这个模式。 – amuliar 2010-10-08 15:07:13

回答

3

不确定是否可以在不使用动态sql来构建变量中的update语句的情况下完成此操作。

这条语句将返回基于你把表名列的列表:

select name from syscolumns 
where [id] = (select [id] from sysobjects where name = 'tablename') 

不知道如果我能避免这里的循环....你需要加载从结果上面放入一个游标,然后从中建立一个查询。伪代码:

set @query = 'update [1607348182] set ' 
load cursor --(we will use @name to hold the column name) 
while stillrecordsincursor 
set @query = @query + @name + ' = tmp_[1607348182]. ' [email protected] + ',' 
load next value from cursor 
loop! 

查询完成后,在循环中构建完成,请使用exec sp_executesql @query。

只是有点警告......在这样的循环中构建动态sql可能会让人有点困惑。为了解决问题,在循环中放置一个选择的@query并观察@query的构建。

编辑: 不知道您是否可以同时更新所有1000行...还有逻辑限制(varchar(8000)?),它的大小也可以增加@query。您可能需要分割代码,以便一次处理50列。将syscolumns select语句中的列放入带有id的临时表中,并构建动态SQL,以便一次更新20列(或50?)。

另一种选择是使用excel来大量构建它。选择列并将结果复制到电子表格的列a中。将'='放入b栏,tmp。[12331312]在列c中,将列a复制到列D中,并将逗号复制到列e中。将整个电子表格复制到记事本中,并且应该为您创建更新语句的列。这不是一个糟糕的解决方案,如果这是一次性事件,不确定是否依赖于此作为正在进行的解决方案。

+0

这似乎是一个最好的解决方案,因为在sql中没有本地表达式来做到这一点。另外,我还遇到了与变量大小的列有关的SQL Server的其他限制。(另外我意识到我的问题源于错误的数据库模式) 因此,您的解决方案似乎是最好的,因为我可以缓存此SQL语句并稍后在其他请求中重用。 – amuliar 2010-10-15 08:57:00

+0

关于varchar(8000)限制。我可以创建varchar(MAX) – amuliar 2010-10-15 08:57:56

+0

好点,我最近在遗留数据库中工作,忘记了varchar(max)。关于可怜的数据库模式...我假设你正在从一个旧的模式工作(很少看到在flatfiles/IDBMS之外的表名)。每晚从传统系统导入标准化数据库可能是一个不错的选择,否则您将花费​​相当多的时间来处理这种可怜的模式,这些模式将被添加到您所做的每个项目中。 – Twelfth 2010-10-15 15:45:06

5

是否可以从主表中删除具有临时ID的主表中的所有内容,然后使用新数据执行插入操作?

+0

是的,我意识到这个解决方案并且实现了它。谢谢 – amuliar 2010-10-15 08:19:29

相关问题