Sql server 如何使用特殊的“未按源匹配”条件编写合并语句? 我正在使用SQL Server 2016 我的源暂存表中有一组服务器名称和属性列,该表由扫描仪填充 我需要将其合并到我的目标表中,以便在合并执行结束时目标和源是相同的 问题是,有时源没有关于某些服务器的任何数据,因为扫描程序无法连接到该服务器。在这种情况下,我不想删除该服务器目标中的行

Sql server 如何使用特殊的“未按源匹配”条件编写合并语句? 我正在使用SQL Server 2016 我的源暂存表中有一组服务器名称和属性列,该表由扫描仪填充 我需要将其合并到我的目标表中,以便在合并执行结束时目标和源是相同的 问题是,有时源没有关于某些服务器的任何数据,因为扫描程序无法连接到该服务器。在这种情况下,我不想删除该服务器目标中的行,sql-server,merge,Sql Server,Merge,以下是我所拥有的,但注释后的项目不起作用注意,我已删除插入部分,因为该部分起作用,而不是问题所在: 将TargetTable合并为目标 使用SourceTable作为源 在源上。[ServerName]=目标。[ServerName] 和源。[Version]=目标。[Version] 当匹配和 源。[平台]目标。[平台] 然后更新集合 目标。[平台]=源。[平台] 如果目标不匹配,则插入。。。 -以下是不起作用的部分 -下面我要做的是首先检查服务器名是否在 -目标存在于源中,即扫描器成功读取

以下是我所拥有的,但注释后的项目不起作用注意,我已删除插入部分,因为该部分起作用,而不是问题所在:

将TargetTable合并为目标 使用SourceTable作为源 在源上。[ServerName]=目标。[ServerName] 和源。[Version]=目标。[Version] 当匹配和 源。[平台]目标。[平台] 然后更新集合 目标。[平台]=源。[平台] 如果目标不匹配,则插入。。。 -以下是不起作用的部分 -下面我要做的是首先检查服务器名是否在 -目标存在于源中,即扫描器成功读取该目标 -服务器。只有在这种情况下,我才能删除该行 当源和目标不匹配时,从源中选择[ServerName]中的[ServerName] 然后删除 ;

这里有一个例子。假设以下是源和目标的开始状态:

SOURCE
ServerName      Version      Platform
----------------------------------------
Server1           1.0         Win2012
Server2           2.0         Win2016
Server4           4.0         Win2016


TARGET
ServerName        Version   Platform
-------------------------------------
Server1           1.0         Win2012
Server2           2.0         Win2012
Server3           3.0         Win2016
Server4           5.0         Win2016
以下是合并后目标中的预期结果

ServerName      Version     Platform
-------------------------------------
Server1           1.0         Win2012
Server2           2.0         Win2016
Server3           3.0         Win2016
Server4           4.0         Win2016
思维方式 Server1在源和目标之间保持不变;按原样保留在目标中

Server2的平台在源代码中的版本与在源代码中的目标版本相同;所以在目标中更新它的属性

由于扫描程序错误,源中不再存在Server3;所以不要从目标中删除

Server4在源代码中有一个新版本;所以服务器确实被扫描了。将源行添加到目标,但从目标中删除缺少的行


它如何不被源代码匹配,而服务器名仍然在源代码中?您正在服务器名称上合并:/Sample数据和预期结果将有助于了解您试图实现的目标。谢谢!我已将示例添加到原始示例中quesiton@syzygy78,好吧,看起来您根本不需要在不匹配SOURCE子句的情况下进行匹配。在MERGE语句中,此部分是可选的。您永远不会从目标中删除。还是你?展开示例数据,并在确实要从目标中删除时显示一个清晰的示例。根据示例行和大部分说明,没有理由进行任何删除操作,只有在匹配时插入和更新。您能否更一致地解释在哪些情况下要从目标中删除?也许你把这里的更新搞混了。就我个人而言,除非我有充分的理由,否则我会避免合并并使用单独的语句。那么,实际上,您可以在目标中有两条记录,其中包含相同的服务器和版本?我认为这会导致合并语句出错。对所有的问题表示歉意,但我不太明白在这种情况下的主键。如果您的逻辑要求事情按特定顺序发生,那么我建议您将其分解为多个insert/update/delete语句。事实上,我建议你无论如何都要这样做!您能编辑并添加上述案例吗?其中目标中存在重复的服务器/版本。我怀疑关于如何合并记录可能存在一些含糊不清的地方