Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.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 Server合并中的多个Update语句_Sql_Sql Server_Merge_Sql Server 2012_Sql Update - Fatal编程技术网

SQL Server合并中的多个Update语句

SQL Server合并中的多个Update语句,sql,sql-server,merge,sql-server-2012,sql-update,Sql,Sql Server,Merge,Sql Server 2012,Sql Update,SQL Server版本:Microsoft SQL Server 2012-11.0.2218.0(x64) 当我运行此查询时,出现以下异常。 异常:类型为“WHEN MATCHED”的操作不能在合并语句的“UPDATE”子句中出现多次。 我知道,在Merge语句中,Update语句不止一次出现异常。 您能告诉我如何实现以下SQL查询逻辑吗? 基于一列, 如果匹配且列不为空,则只更新一个不同的列。 如果匹配且列为空,则更新大多数列。 如果不匹配,则插入。 完整的SQL是 MERGE Targe

SQL Server版本:Microsoft SQL Server 2012-11.0.2218.0(x64)

当我运行此查询时,出现以下异常。 异常:类型为“WHEN MATCHED”的操作不能在合并语句的“UPDATE”子句中出现多次。

我知道,在Merge语句中,Update语句不止一次出现异常。 您能告诉我如何实现以下SQL查询逻辑吗?

基于一列,
如果匹配且列不为空,则只更新一个不同的列。
如果匹配且列为空,则更新大多数列。
如果不匹配,则插入。

完整的SQL是

MERGE TargetTable AS targetT 
USING   SourceTable AS sourceT ON sourceT.Npi = targetT.Npi
WHEN    MATCHED AND IsNull(targetT.SPI, '') <> '' THEN
        UPDATE SET targetT.Taxonomy = sourceT.Taxonomy --Update Only One Column

WHEN    MATCHED AND IsNull(targetT.SPI,'')= '' THEN --Update Rest of the Columns
        UPDATE SET targetT.state_license_no = sourceT.state_license_no, targetT.NPI = sourceT.NPI, targetT.PrefixName = sourceT.PrefixName,targetT.last_name = sourceT.last_name,targetT.first_name = sourceT.first_name
               ,MiddleName = sourceT.MiddleName,targetT.SuffixName = sourceT.SuffixName, targetT.address_1 = sourceT.address_1,targetT.address_2 = sourceT.address_2,targetT.City = sourceT.City,targetT.State = sourceT.State
               ,zip = sourceT.zip,targetT.phone = sourceT.phone,targetT.Fax = sourceT.Fax,targetT.last_modified_date = sourceT.last_modified_date,targetT.Taxonomy = sourceT.Taxonomy           

WHEN    NOT MATCHED BY TARGET --Insert New Row
        THEN
        INSERT (state_license_no, NPI, prefixname, last_name, first_name, MiddleName, SuffixName, address_1, address_2, City, State, zip, phone, Fax, last_modified_date, Taxonomy, Data_source)
                                    VALUES (sourceT.state_license_no, sourceT.NPI, sourceT.PrefixName, sourceT.last_name, sourceT.first_name, sourceT.MiddleName, sourceT.SuffixName, 
                                    sourceT.address_1, sourceT.address_2, sourceT.City, sourceT.State, sourceT.zip, 
                                    sourceT.phone, sourceT.Fax, sourceT.last_modified_date, sourceT.Taxonomy, sourceT.Data_source);
将TargetTable合并为targetT
将SourceTable用作sourceT.Npi=targetT.Npi上的sourceT
如果匹配且为空(targetT.SPI,“)”,则
更新集targetT.Taxonomy=sourceT.Taxonomy——只更新一列
当匹配并为空时(targetT.SPI,“)=”,然后更新其余列
更新集targetT.state\u license\u no=sourceT.state\u license\u no,targetT.NPI=sourceT.NPI,targetT.PrefixName=sourceT.PrefixName,targetT.last\u name=sourceT.last\u name,targetT.first\u name=sourceT.first\u name
,MiddleName=sourceT.MiddleName,targetT.SuffixName=sourceT.SuffixName,targetT.address\u 1=sourceT.address\u 1,targetT.address\u 2=sourceT.address\u 2,targetT.City=sourceT.City,targetT.State=sourceT.State
,zip=sourceT.zip,targetT.phone=sourceT.phone,targetT.Fax=sourceT.Fax,targetT.last\u modified\u date=sourceT.last\u modified\u date,targetT.Taxonomy=sourceT.Taxonomy
当目标不匹配时--插入新行
然后
插入(州许可证号、NPI、前缀名、姓、名、中间名、后缀名、地址1、地址2、城市、州、邮政编码、电话、传真、上次修改日期、分类法、数据源)
值(sourceT.state\u许可证号、sourceT.NPI、sourceT.PrefixName、sourceT.last\u名称、sourceT.first\u名称、sourceT.MiddleName、sourceT.SuffixName、,
sourceT.address_1,sourceT.address_2,sourceT.City,sourceT.State,sourceT.zip,
sourceT.phone、sourceT.Fax、sourceT.last\u modified\u date、sourceT.Taxonomy、sourceT.Data\u source);

< /代码>

不要认为这是一个答案,我也没有测试代码。我尝试的是,为每一列添加一个case语句。

MERGE TargetTable AS targetT 
USING   SourceTable AS sourceT ON sourceT.Npi = targetT.Npi
WHEN    MATCHED THEN
        UPDATE  SET targetT.Taxonomy = CASE WHEN  IsNull(targetT.SPI, '') <> '' THEN sourceT.Taxonomy ELSE targetT.Taxonomy END,
                targetT.state_license_no = CASE WHEN IsNull(targetT.SPI,'')= '' THEN sourceT.state_license_no ELSE targetT.state_license_no END
WHEN    NOT MATCHED BY TARGET --Insert New Row
        THEN
        INSERT (state_license_no, NPI, prefixname, last_name, first_name, MiddleName, SuffixName, address_1, address_2, City, State, zip, phone, Fax, last_modified_date, Taxonomy, Data_source)
                                    VALUES (sourceT.state_license_no, sourceT.NPI, sourceT.PrefixName, sourceT.last_name, sourceT.first_name, sourceT.MiddleName, sourceT.SuffixName, 
                                    sourceT.address_1, sourceT.address_2, sourceT.City, sourceT.State, sourceT.zip, 
                                    sourceT.phone, sourceT.Fax, sourceT.last_modified_date, sourceT.Taxonomy, sourceT.Data_source);
将TargetTable合并为targetT
将SourceTable用作sourceT.Npi=targetT.Npi上的sourceT
当匹配时
更新集targetT.Taxonomy=为null时的大小写(targetT.SPI“”),然后是sourceT.Taxonomy ELSE targetT.Taxonomy END,
targetT.state\u license\u no=当IsNull(targetT.SPI,“)=”时,则sourceT.state\u license\u no其他targetT.state\u license\u no END
当目标不匹配时--插入新行
然后
插入(州许可证号、NPI、前缀名、姓、名、中间名、后缀名、地址1、地址2、城市、州、邮政编码、电话、传真、上次修改日期、分类法、数据源)
值(sourceT.state\u许可证号、sourceT.NPI、sourceT.PrefixName、sourceT.last\u名称、sourceT.first\u名称、sourceT.MiddleName、sourceT.SuffixName、,
sourceT.address_1,sourceT.address_2,sourceT.City,sourceT.State,sourceT.zip,
sourceT.phone、sourceT.Fax、sourceT.last\u modified\u date、sourceT.Taxonomy、sourceT.Data\u source);
我只为两列添加了更新。这将很长,但在理想情况下必须有效。

如“如果匹配的
子句中有两个
,则必须指定一个
更新
操作,并且必须指定一个
删除
操作”

资料来源:


希望这能有所帮助。

这是一个巨大的漏洞,但您可以定义一个“代替删除”触发器,并将其用于备用更新案例

如果在目标_表上定义了任何INSTEAD OF UPDATE或INSTEAD OF DELETE触发器,则不会执行更新或删除操作。而是触发触发器,并相应地填充插入和删除的表

i、 e您可以执行“匹配时”和…(更新)其他操作(删除)。而不是delete触发器可以执行更新


这可能适用于您尝试执行“软删除”的情况,这是一个不错的主意,但执行起来需要很多时间。
WHEN MATCHED THEN <merge_matched>
The MERGE statement cannot update the same row more than once, or update and delete the same row.