【问题标题】:Updating tables without naming all columns更新表而不命名所有列
【发布时间】:2012-08-22 02:10:39
【问题描述】:

我找到了一种使用此模板使来自不同数据库的两个表相互匹配的方法:

INSERT [DestDB].[dbo].[TABLE]
SELECT source.* FROM 
[SourceDB].[dbo].[TABLE] AS source
LEFT OUTER JOIN
[DestDB].[dbo].[TABLE] AS dest
ON 
source.[PKColumn] = dest.[PKColumn]
WHERE dest.[PKcolumn] IS NULL

UPDATE dest
SET 
 dest.[PK_COLUMN1] = source.[PK_COLUMN1]
,dest.[COLUMN2] = source.[COLUMN2]
,dest.[COLUMN3] = source.[COLUMN3]
,dest.[COLUMN4] = source.[COLUMN4]
,dest.[COLUMN5] = source.[COLUMN5]
,dest.[COLUMN6] = source.[COLUMN6]
,dest.[COLUMN7] = source.[COLUMN7]
,dest.[COLUMN8] = source.[COLUMN8]

FROM 
[SourceDB].[dbo].[TABLE] AS source
INNER JOIN 
[DestDB].[dbo].[TABLE] AS dest
ON source.[PK_Column1] = dest.[PK_Column1]

但是,我正在使用的某些表至少有 200 列,虽然可以通过复制 + 粘贴的功能来做到这一点,但我只需要知道是否有一种方法不需要我获得 Carpel Tunnel综合症。

我正在使用 Microsoft SQL Server 2005。

有什么建议吗?

【问题讨论】:

  • 两个表(目标和源)中的所有列都匹配吗?

标签: sql-server-2005 insert-update multiple-columns


【解决方案1】:

我认为你不能在不命名列的情况下更新列,但你可以使用 SQL 和 sys.columns 视图为你编写脚本:

select ',dest.[' + name + '] = source.[' + name +']' 
from sys.columns 
WHERE object_id = OBJECT_ID(N'[dbo].[Widgets]')

-- 输出--

,dest.[WidgetId] = source.[WidgetId]
,dest.[WidgetName] = source.[WidgetName]
,dest.[CreatedDt] = source.[CreatedDt]
,dest.[WidgetValue] = source.[WidgetValue]
,dest.[ModifiedDt] = source.[ModifiedDt]

唯一的另一种方法是不更新,而是截断目标表并执行SELECT INTO

SELECT * INTO DEST FROM SOURCE

【讨论】:

  • 首先:救命稻草。其次,此代码将不起作用,因为在更新时,不允许为正在更新的表提供别名。例如,UPDATE [DestTable] dest SET dest.RecordType = source.RecordType FROM SourceTable source .. 将不起作用
  • 如何使它工作是通过删除别名:UPDATE DestTable SET RecordType = Source.RecordType FROM sourceTable source
  • 是的,可以在更新语句中使用别名。但是如果没有代码,代码也可以正常工作。
【解决方案2】:

您可以使用动态 sql(以及@ChrisGessler 提供的信息)来做您想做的事情。

如果您不能或不想使用它,另一种可能性是:

  1. 将匹配的行传递到新表中
  2. 删除目标表中的行
  3. 在目标表中添加行

第 1 步可能是这样的:

SELECT * INTO newtable
FROM 
[SourceDB].[dbo].[TABLE] AS source
INNER JOIN 
[DestDB].[dbo].[TABLE] AS dest
ON source.[PK_Column1] = dest.[PK_Column1]

记得最后删除新表。

【讨论】:

  • 如果由于参照完整性而在 dest 表中有 FK,这将不起作用。如果不是这种情况,为什么还要费心将行从一个表复制到另一个表,而不仅仅是删除并完全重新插入到目标表中?
  • @oerl 这也确实回答了另一种情况,即您正在删除 dest 表中的行。我发现这在更新中很少见。
猜你喜欢
  • 2020-11-17
  • 2022-01-19
  • 1970-01-01
  • 1970-01-01
  • 2014-11-04
  • 1970-01-01
  • 1970-01-01
  • 2012-09-30
相关资源
最近更新 更多