Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/79.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何使用MERGE更新源和目标?_Sql_Sql Server_Insert_Merge - Fatal编程技术网

Sql 如何使用MERGE更新源和目标?

Sql 如何使用MERGE更新源和目标?,sql,sql-server,insert,merge,Sql,Sql Server,Insert,Merge,我有两个要合并的表。每行包含上次修改的时间。我希望合并这些表,以便将最新的值分配给这两个表 这是我想要使用的代码,被注释掉的是导致我出现问题的原因 -- synchronize databases MERGE [ClientDB].[dbo].[Table] trgt USING [MasterDB].[dbo].[Table] src ON trgt.ID = src.ID WHEN MATCHED THEN -- IF src.LastModified > trgt.Last

我有两个要合并的表。每行包含上次修改的时间。我希望合并这些表,以便将最新的值分配给这两个表

这是我想要使用的代码,被注释掉的是导致我出现问题的原因

-- synchronize databases

MERGE [ClientDB].[dbo].[Table] trgt
USING [MasterDB].[dbo].[Table] src

ON trgt.ID = src.ID

WHEN MATCHED THEN
  -- IF src.LastModified > trgt.LastModified   -- if the source is newer 
       UPDATE SET trgt.[Info] = src.[Info]     -- update the target
  -- ELSE 
    -- UPDATE SET src.[Info] = trgt.[Info]     -- otherwise update the source

WHEN NOT MATCHED BY SOURCE
    THEN DELETE

WHEN NOT MATCHED BY TARGET
    THEN INSERT ([Info]) VALUES (src.[Info]);
它不起作用有两个原因

1) 它在语法上似乎与嵌套在
中的
IF
语句不相似,如果匹配,则

2) 它也不希望我更新源代码,这是有问题的,因为我想同步这两种方式。如果我切换
trgt
src
我会得到错误:

无法绑定多部分标识符“src.Description”

我怎样才能做到这一点?我应该放弃
合并
,还是它有能力做我想做的事情


我对SQL非常陌生,所以如果它在任何地方出错,请随时纠正我的想法。提前感谢。

长话短说,SQL Server只允许您对每条语句修改(插入、更新或删除)一个表。更新两个表需要两条语句。

如其他答案和注释中所述,不能在一条语句中执行双向合并,必须使用多条合并语句。事实上,你需要四个

  • 更新ClientDB(包括ON语句中最后修改的比较)
  • 更新MasterDB(包括ON语句中最后修改的比较)
  • 在记录不存在的位置插入ClientDB
  • 在不存在记录的地方插入MasterDB
  • 这会破坏MERGE语句的使用,您可以使用标准的UPDATE&INSERT查询

    注意:当源代码不匹配时,您可能也不需要
    
    
    然后删除
    ,因为这将无法从另一个数据库获取新记录。

    我只需要调用merge两次。我决定只有主数据库可以添加或删除整行

    这对我很有用:

    -- merge databases 
    
    -- update the client from the master 
    MERGE [ClientDB].[dbo].[table] trgt
    using [MasterDB].[dbo].[table] src
    ON trgt.id = src.id 
    
    WHEN matched AND trgt.lastmodified <= src.lastmodified THEN -- if the master has a row newer than the client                      
      UPDATE SET trgt.[info] = src.[info], ...                  -- update the client 
    
    WHEN NOT matched BY source -- delete any rows added by a client 
    THEN 
      DELETE 
    WHEN NOT matched BY target -- insert any rows added by the master 
    THEN 
      INSERT ( [info], ... ) VALUES (src.[info], ... ); 
    
    -- update the master from the client 
    MERGE [MasterDB].[dbo].[table] trgt 
    using [ClientDB].[dbo].[table] src 
    ON trgt.id = src.id 
    
    WHEN matched AND trgt.lastmodified < src.lastmodified THEN  -- if the client is newer than the master               
      UPDATE SET trgt.[info] = src.[info], ...          -- update the master 
    
    ——合并数据库
    --从主服务器更新客户端
    合并[ClientDB].[dbo].[table]trgt
    使用[MasterDB].[dbo].[table]src
    在trgt.id=src.id上
    
    当匹配并修改trgt.lastmodified时,合并不是这样工作的——它用于在一条语句中对一个表进行更新和插入。这不是同时更新两个表。第二个语句也可能只是一个简单的更新,尽管我可以理解您可能希望使用另一个合并来保持一致性。