通过SELECT更新一个包含25列的表格?

Ibr*_*him -2 sql sql-server sql-server-2008-r2 sql-update

在SQL Server中,如果我有两个表,每个表有(25)列,如何通过SELECT更新表?

查询是:

UPDATE
    Table1
SET
    Table1.col1 = Table2.col1,
    Table1.col2 = Table2.col2,
    ...
    ...
    ...
    Table1.col25 = Table2.col25,

FROM
    Table1
INNER JOIN
    Table2
ON
    Table1.id = Table2.id
Run Code Online (Sandbox Code Playgroud)

但有没有办法更新所有列而不写上面的例子所有25列?

bil*_*nkc 6

在SSMS中使用对象资源管理器,找到有问题的表并展开节点,以便您看到列,键,约束,触发器,索引和统计信息

将Columns文件夹拖到查询窗口窗格中.这会在一行中生成列空间分隔的列列表.

我们将使用正则表达式将数据转换为所需的格式.

要知道的事情.

\n 是换行符/回车/输入

^ 匹配一行的开头

. 一次匹配任何东西

* 只要它可以去,就重复比赛

我会标记我们匹配的单词,以便我们可以用它做点什么.这来自括号{}.当事情被括号括起来时,我们对序数的引用会增加.在这里,我们只使用一个/1就足够了.

正则表达式是贪婪的,这意味着它将尽可能匹配,这不是我们想要的.不幸的是,SSMS 支持贪婪的比赛,因此我们必须进行多次传球

(注意上面的尾随空格)

  • 理论替代: \n, T1.\1 = T2.\1

第1轮

在此步骤中,我们将强制所有列都存在于一行中

重要说明:查找内容中包含一个尾随空格

  • 找什么: ,
  • 用...来代替: \n
  • 顺便拜访: Current Document
  • 使用: Regular expressions

开始

environment_id, environment_name, folder_id, description, created_by_sid, created_by_name, created_time
Run Code Online (Sandbox Code Playgroud)

结果

environment_id
environment_name
folder_id
description
created_by_sid
created_by_name
created_time
Run Code Online (Sandbox Code Playgroud)

我们现在已经采用了所有列,并将它们展平在左边缘.

第2轮

我们将采用所有单词并用T1 = T2包装它们

除了我是一个领先的逗号人之外,我将使我的输出看起来与你的相似.

  • 找什么: ^{.*}
  • 用...来代替: , T1.\1 = T2.\1
  • 顺便拜访: Current Document
  • 使用: Regular expressions

启动environment_id environment_name folder_id说明created_by_sid created_by_name created_time

结果

,   T1.environment_id = T2.environment_id
,   T1.environment_name = T2.environment_name
,   T1.folder_id = T2.folder_id
,   T1.description = T2.description
,   T1.created_by_sid = T2.created_by_sid
,   T1.created_by_name = T2.created_by_name
,   T1.created_time = T2.created_time
Run Code Online (Sandbox Code Playgroud)

现在你有一个很好的,几乎干净的列翻译列表.修剪第一个逗号并将其打入UPDATE语句