自动匹配INSERT INTO ... SELECT ... FROM中的列

Kon*_*rin 13 sql t-sql sql-server select insert

SQL Server问题.做的时候

INSERT INTO T1 SELECT (C1, C2) FROM T2
Run Code Online (Sandbox Code Playgroud)

我不想指定列名,T1因为它们与in中的相同T2

有可能这样做吗?

目前我收到了错误

Msg 213,Level 16,State 1,Line 1

列名或提供的值数与表定义不匹配.

Rem*_*anu 20

始终在INSERT和SELECT投影中都使用显式列.即使你不想,你应该:

INSERT INTO T1 (C1, c2)
SELECT C1, C2 FROM T2
Run Code Online (Sandbox Code Playgroud)

  • 这是一种很好的做法,因为数据库系统无法跟踪客户端代码中的依赖关系.可以向T2添加列,也可以重新组织T2以更改列顺序,或者可以删除列,所有操作都会导致代码中断. (10认同)
  • 这是代码重复,我想摆脱支持常规驱动的方法(具有相同名称的列应该只相互映射) (3认同)
  • 代码重复不应该是好的做法. (3认同)
  • SQL通常是一种冗长的语言.例如,group by子句在聚合中是多余的,INTO是多余的.我想你必须接受这一点. (2认同)

Guf*_*ffa 14

是的,您可以省略插入的表的字段名称,并且可以使用select*来获取表中的所有字段,但我不建议使用此方法.

如果省略字段名称,则字段按位置匹配,而不是按名称匹配.如果字段的顺序不完全相同,则会混淆.通常,您应该避免依赖表的确切布局,以最大程度地降低表中更改破坏查询的风险.

  • 有没有办法在不指定所有列名的情况下插入除“身份键”之外的所有列?我使用的表格包含数十列,每次都列出它们真的很无聊。 (2认同)
  • @Konstantin:不,没有简单的方法可以指定除身份字段之外的所有字段。要么全有要么全无。 (2认同)

Don*_*nie 5

如果T1T2完全匹配,你有两个选择。您可以select从所有列T2insert into T1,或者你可以提供一个列清单的insert声明。

即使当您执行selectMSSQL 提供的列标题时,insert语句也不会使用该信息来匹配列。