我找到了一种方法,可以使用此模板使来自不同数据库的两个表相互匹配:
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列,虽然可以通过Copy + Paste的功能来实现这一点,但我只需要知道是否有一种方法不会让我获得Carpel Tunnel综合征。
我使用的是Microsoft SQL Server 2005。
有什么建议吗?
答案 0 :(得分: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]
唯一的另一种方法是不更新,而是截断dest表并执行SELECT INTO
SELECT * INTO DEST FROM SOURCE
答案 1 :(得分:0)
您可以使用动态sql(以及提供的@ChrisGessler信息)来执行您想要的操作。
如果您不能或不想使用它,另一种可能性是:
第1步可能是这样的:
SELECT * INTO newtable
FROM
[SourceDB].[dbo].[TABLE] AS source
INNER JOIN
[DestDB].[dbo].[TABLE] AS dest
ON source.[PK_Column1] = dest.[PK_Column1]
记得最后放弃新表格。