8

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

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 Syndrome。

我正在使用 Microsoft SQL Server 2005。

有什么建议吗?

4

2 回答 2

9

我不认为您可以在不命名列的情况下更新列,但您可以使用 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
于 2012-08-27T15:06:21.757 回答
0

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

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

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

第 1 步可能是这样的:

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

最后记得删除新表。

于 2012-08-27T15:11:01.390 回答