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

无效。

4

2 回答 2

5

从主表中删除在 temp 中有 ID 的所有内容,然后用新数据插入是否可行?

于 2010-10-08T14:59:51.560 回答
3

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

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

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]. ' +@name + ','
load next value from cursor
loop!

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

只是一点警告......在这样的循环中构建动态 sql 可能会有点混乱。对于故障排除,将 select @query 放入循环中并观察 @query 构建。

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

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

于 2010-10-08T16:21:04.897 回答