SQL 中是否真的没有办法在不显式输入字段名称的情况下更新表中的所有字段

Jam*_*esi 4 sql-server

如本文所示更新另一个表中的所有列

我需要使用另一个表中的值更新一个包含 50 列的表,然后从另一个表(包含 50 列)插入新记录。我真的不想列出 50 个名称-值对(或者使用这里的批量更新语法Bulk update of all columns,无论如何 SQL Server 似乎都不喜欢这种语法)。

因此,我可以得出以下结论之一:

  1. 毕竟有办法,
  2. 一个有 50 列的表是很荒谬的,或者
  3. 数据库管理员是受虐狂。

Ian*_*n_H 5

除非我在这里错过了一些东西——我可能错过了——我认为这相当简单。

本质上,这里唯一的问题是您不想键入所有列名称 - 这可以通过使用 sys 表的一些动态 SQL 轻松实现自动化,如 Randolph West 所暗示的那样。

就像是

select @Sql = COALESCE(@Sql + ', ', '') + COLUMN_NAME
from 
    INFORMATION_SCHEMA.COLUMNS
where 
    TABLE_NAME='Table'
Run Code Online (Sandbox Code Playgroud)

这将列出所有用逗号分隔的列,就像您键入它们准备插入/更新(或选择)一样。

这篇文章:在插入查询中动态选择列名是一个堆栈溢出问题,详细介绍。

编辑:

只是为了清楚起见我会添加一些评论:-

任何内容都可以添加到 @Sql 'building' 位,例如,如果您希望将表名放在列名之前,则选择部分将为:

select @Sql = COALESCE(@Sql + ', ', '') + TABLE_NAME + '.' + COLUMN_NAME
Run Code Online (Sandbox Code Playgroud)

您可以使用执行该变量

sp_executesql @Sql
Run Code Online (Sandbox Code Playgroud)

要不就

SELECT @Sql
Run Code Online (Sandbox Code Playgroud)

在查询执行窗口中将其提供给您,您可以复制并粘贴并运行(我通常会这样做 - 您可以先仔细检查代码,然后根据需要进行编辑)