Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.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 如果未进行任何更改,则阻止更新_Sql_Sql Server_Nested Queries - Fatal编程技术网

Sql 如果未进行任何更改,则阻止更新

Sql 如果未进行任何更改,则阻止更新,sql,sql-server,nested-queries,Sql,Sql Server,Nested Queries,我正在尝试进行一个查询,如果记录存在,则更新记录;如果不存在,则插入记录 但是,如果没有进行任何更改。我想阻止执行update命令 查询: MERGE INTO [TESTSRV].[dbo].[COLOR_CODE_PRICE] USING (Values ('1000','052011','A','20170418','20170430',0.500)) AS params(CNS_CUST,COLOR_CODE,INV_ROUTE,START,EXPIRE,PRICE) ON COLOR

我正在尝试进行一个查询,如果记录存在,则更新记录;如果不存在,则插入记录

但是,如果没有进行任何更改。我想阻止执行update命令

查询:

MERGE INTO [TESTSRV].[dbo].[COLOR_CODE_PRICE]
USING (Values ('1000','052011','A','20170418','20170430',0.500)) 
AS params(CNS_CUST,COLOR_CODE,INV_ROUTE,START,EXPIRE,PRICE)
ON COLOR_CODE_PRICE.CNS_CUST = params.CNS_CUST
AND COLOR_CODE_PRICE.COLOR_CODE = params.COLOR_CODE
AND COLOR_CODE_PRICE.INV_ROUTE = params.INV_ROUTE
AND (COLOR_CODE_PRICE.PRICE != params.PRICE
OR COLOR_CODE_PRICE.START != params.START
OR COLOR_CODE_PRICE.EXPIRE != params.EXPIRE)
WHEN MATCHED THEN
UPDATE SET PRICE = params.price, 
           START = params.START, 
           EXPIRE = params.EXPIRE, 
           DATE_MODIFIED = GETDATE(), 
           MODIFIED_BY = 'USER'
WHEN NOT MATCHED THEN
INSERT VALUES (params.CNS_CUST,params.COLOR_CODE,params.INV_ROUTE,params.START,params.EXPIRE,params.PRICE,GETDATE(),NULL,'USER');
表结构:

原因是我将在Excel中的VBA宏中使用此查询。 通过
Select
query检索记录。在
范围内循环

对于每行:

  • 如果没有更改-跳过更新(跳过修改
    MODIFIED_BY
    和其他可追溯性列)
  • 如果存在-插入
  • 如果有更改-更新

我成功地更新和插入了记录。那么我如何阻止更新呢?

我认为当匹配和源。[Key1]目标。[Key1]和源。[Key2]目标。[Key2]然后
时,您可以使用

以下是MSDN的链接(如果有帮助):

如果有帮助,请尝试以下查询:

MERGE INTO [TESTSRV].[dbo].[COLOR_CODE_PRICE]
USING (Values ('1000','052011','A','20170418','20170430',0.500)) AS params(CNS_CUST,COLOR_CODE,INV_ROUTE,START,EXPIRE,PRICE)
ON COLOR_CODE_PRICE.CNS_CUST = params.CNS_CUST
AND COLOR_CODE_PRICE.COLOR_CODE = params.COLOR_CODE
AND COLOR_CODE_PRICE.INV_ROUTE = params.INV_ROUTE
AND (COLOR_CODE_PRICE.PRICE != params.PRICE
OR COLOR_CODE_PRICE.START != params.START
OR COLOR_CODE_PRICE.EXPIRE != params.EXPIRE)
WHEN MATCHED AND COLOR_CODE_PRICE.PRICE <>params.price 
        AND  COLOR_CODE_PRICE.START <>params.START 
        AND COLOR_CODE_PRICE.EXPIRE <>params.EXPIRE  THEN
UPDATE SET PRICE = params.price, 
           START = params.START, 
           EXPIRE = params.EXPIRE, 
           DATE_MODIFIED = GETDATE(), 
           MODIFIED_BY = 'USER'
WHEN NOT MATCHED THEN
INSERT VALUES (params.CNS_CUST,params.COLOR_CODE,params.INV_ROUTE,params.START,params.EXPIRE,params.PRICE,GETDATE(),NULL,'USER');
合并到[TESTSRV].[dbo].[COLOR\u code\u PRICE]
使用(值('1000'、'052011'、'A'、'20170418'、'20170430',0.500))作为参数(CNS客户、颜色代码、库存路线、开始、到期、价格)
关于颜色代码,请参见PRICE.CNS\u CUST=params.CNS\u CUST
和COLOR\u CODE\u PRICE.COLOR\u CODE=params.COLOR\u CODE
和颜色\u代码\u PRICE.INV\u ROUTE=params.INV\u ROUTE
和(颜色代码价格!=参数价格)
或颜色\u代码\u PRICE.START!=params.START
或颜色\u代码\u PRICE.EXPIRE!=params.EXPIRE)
匹配和颜色时\u代码\u PRICE.PRICE参数.PRICE
和颜色\u代码\u PRICE.START参数.START
和颜色\u代码\u价格。过期参数。然后过期
更新设置价格=参数价格,
START=params.START,
EXPIRE=params.EXPIRE,
修改日期=GETDATE(),
修改的用户='USER'
当不匹配时
插入值(params.CNS_CUST,params.COLOR_CODE,params.INV_ROUTE,params.START,params.EXPIRE,params.PRICE,GETDATE(),NULL,'USER');

你能举个例子吗?或者最好通过修改我的查询来建议答案?