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

前端之家收集整理的这篇文章主要介绍了sql – 如何在不指定列名的情况下从另一个表更新一个表?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有两个表具有相同的结构和非常大的字段数(约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

无效.

解决方法

不确定是否能够在不使用动态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中.将整个电子表格复制到记事本中,您应该为您构建更新语句的列.如果这是一次性事件并不是一个糟糕的解决方案,不确定我是否依赖于此作为一个持续的解决方案.

猜你在找的MsSQL相关文章