【问题标题】:Prevent updating if no changes were made如果未进行任何更改,则阻止更新
【发布时间】:2017-04-18 06:43:52
【问题描述】:

我正在尝试进行查询,如果记录存在则更新记录,否则插入。

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

查询:

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 查询检索记录。循环通过Range

对于每一行:

  • 如果未进行任何更改 - 跳过更新(跳过修改 MODIFIED_BY 和其他可追溯性列)
  • 如果存在 - 插入
  • 如果有变化 - 更新

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

【问题讨论】:

    标签: sql sql-server nested-queries


    【解决方案1】:

    我想你可以使用WHEN MATCHED AND source.[Key1] <> target.[Key1] AND source.[Key2]<>target.[Key2] THEN

    如果有帮助,以下是 MSDN 的链接: https://docs.microsoft.com/en-us/sql/t-sql/statements/merge-transact-sql 请尝试以下查询,如果有帮助:
    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');
    

    【讨论】:

    • 你能举个例子吗?还是通过修改我的查询更好地建议答案?
    猜你喜欢
    • 2017-04-08
    • 1970-01-01
    • 2020-10-07
    • 2020-04-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-15
    相关资源
    最近更新 更多