如何在不指定列名的情况下从另一个表更新一个表?

时间:2010-10-08 14:56:19

标签: sql sql-server-2005 sql-update large-data

我有两个表具有相同的结构和非常大的字段数(大约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

无效。

2 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分:3)

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

此语句将根据您输入的表名返回列列表:

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

不确定我是否可以在此处避免循环....您需要将上面的结果加载到游标中,然后从中构建查询。 Psuedo编码:

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

当在循环中构建查询时,使用exec sp_executesql @query。

只是一点警告......在这样的循环中构建动态sql会让人感到有些困惑。对于故障排除,在循环中选择@query并观察@query是否已构建。

编辑: 不确定你是否能够同时在更新中完成所有1000行...对于@query也可以增长的大小有逻辑限制(varchar(8000)?)。您可能必须划分代码,以便一次处理50列。将syscolumns select语句中的列放入带有id的临时表中并构建动态sql,以便一次更新20列(或50?)。

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