dev*_*ead 2 sql sql-server merge
我的任务是同步2个表(两者都相同).它们各有60列.表A是最初填充的主表.我需要创建一个存储过程(完成),它将合并这两个表,并在调用时用相同的确切数据(更新,插入,删除)填充它们.我如何在SQL中使用MERGE函数来实现这一目标?我已经查看了MSDN文档和类似于technet的文档,但我对入门感到困惑.我是否需要指定需要合并的每个字段?或者这是一个我想要执行此操作的简单电话?
以下是MERGE语句的简单示例的链接:
http://www.simple-talk.com/sql/learn-sql-server/the-merge-statement-in-sql-server-2008/
基本语法如下:
MERGE table1
USING table2
ON table1.id = table2.id
WHEN MATCHED THEN
--Do an update here
WHEN NOT MATCHED BY TARGET THEN
--Do an insert here (or a delete)
;
Run Code Online (Sandbox Code Playgroud)
你也可以使用 WHEN NOT MATCHED BY SOURCE
小智 6
超过60列是一个很大的数目!当我需要同步2个相同的表时,我会执行以下操作:
;WITH tbl_to_synch as (
-- Prepare table to update,
Select *,chk = CHECKSUM(*) from [dbo].[tableA]
)
MERGE tbl_to_synch as [Target]
USING (Select *,chk = CHECKSUM(*) from [dbo].[tableB]) as [source]
ON [Target].key = [source].key
WHEN MATCHED AND [Target].chk <> [source].chk THEN
-- UPDATE ONLY row that is changed
UPDATE
SET
column01 = [source].[column01]
,column02 = [source].[column01]
-- ....
,column59 = [source].[column59]
,column60 = [source].[column59]
WHEN NOT MATCHED BY TARGET THEN
insert (column01, column02, ...,column59,column60)
values (column01, column02, ...,column59,column60)
WHEN NOT MATCHED BY SOURCE THEN DELETE
-- Show what is changed
OUTPUT $action, ISNULL(INSERTED.key,DELETED.key);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3299 次 |
| 最近记录: |