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

amu*_*iar 8 sql sql-server-2005 large-data sql-update

我有两个表具有相同的结构和非常大的字段数(约1000).我需要执行2次操作1)从第二个表插入所有行到拳头.例:

INSERT INTO [1607348182]
SELECT * 
FROM _tmp_1607348182;
Run Code Online (Sandbox Code Playgroud)

2)从第二个表更新第一个表但是为了更新,我找不到适当的sql语法进行更新.

查询如下:

Update [1607348182]
set [1607348182].* = tmp.*
from [1607348182]
inner join _tmp_1607348182 as tmp on tmp.recordid = [1607348182].recordid
Run Code Online (Sandbox Code Playgroud)

要么

Update [1607348182]
from [1607348182]
inner join _tmp_1607348182 as tmp on tmp.recordid = [1607348182].recordid
Run Code Online (Sandbox Code Playgroud)

无效.

Ken*_*ick 5

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


Twe*_*fth 3

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

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

select name from syscolumns
where [id] = (select [id] from sysobjects where name = 'tablename')
Run Code Online (Sandbox Code Playgroud)

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

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!
Run Code Online (Sandbox Code Playgroud)

当查询在循环中构建完成后,使用 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 列。将整个电子表格复制到记事本中,您应该已经为您构建了更新语句的列。如果这是一次性事件,那么这是一个不错的解决方案,不确定我是否会依赖它作为持续的解决方案。