【问题标题】:T-SQL Inserting copy of rows from one table to another only with values from variables instead of one columnT-SQL仅使用变量而不是一列的值将行的副本从一个表插入到另一个表
【发布时间】:2020-10-19 02:23:45
【问题描述】:

我见过类似的东西

INSERT INTO TableNew
    SELECT *  
    FROM TableOld
    WHERE [Conditions]

将数据/行从一个表复制到另一个表。但对我来说.. 说 TableOld 有列

A B C D E F G H I J K L M N 

我只想复制列

C D E F G H I J K L M N 

将 TableOld 转换为 TableNew。两个表的列数相同,但 TableNew 的前两个是我需要在插入之前为其生成的 Id 值。所以我需要在 TableNew 中插入一个新行,其中前两列的数据来自变量,其余的是 TableOld 中一行的一些列的副本,对于 TableOld 中的每一行,TableNew 中还没有一行在哪里说 TableNew.C = TableOld.c 和 TableNew.D = TableOld.D。

我想过做一个游标来遍历 TableOld 的每一行并执行每个插入并检查已经存在的匹配 (C & D) 行,但想知道是否有更好的方法来做到这一点更像以上。

【问题讨论】:

  • 您需要生成什么样的“Id”值? identity 列将自行处理,只需从列列表中省略它即可。也许是带有defaultNewId 的GUID?同样的交易。否则,在两边指定列列表,即insert into TargetTable ( Foo, Bar, Elvis, ... ) select Elvis, ... from SourceTable where ...;

标签: sql-server database tsql datatable rows


【解决方案1】:

普遍接受最佳实践始终明确指定列列表 - 无论是在您的 INSERT 语句中,还是在您的 SELECT 中使用明确的列列表,而不是*:

INSERT INTO TableNew (C, D, E, F, G, H, I, J, K, L, M, N)
    SELECT C, D, E, F, G, H, I, J, K, L, M, N
    FROM TableOld
    WHERE [Conditions]

根本不需要凌乱的 RBAR(逐行)光标!

【讨论】:

  • 是的,但是我将如何包含 TableNew 的 A 和 B 列的新值并且需要在插入之前创建。这是我试图找到更好解决方案的主要问题。
  • 需要在插入之前制作是什么意思??根本不清楚.....但是您当然可以将列A和B添加到INSERT列列表中的列列表中,然后在您的@中提供固定值作为SQL变量这两列的 987654326@ 语句...
猜你喜欢
  • 2020-11-25
  • 2014-07-29
  • 1970-01-01
  • 2015-07-02
  • 1970-01-01
  • 1970-01-01
  • 2012-09-19
  • 1970-01-01
相关资源
最近更新 更多