如果未进行任何更改,则阻止更新
Prevent updating if no changes were made
我正在尝试进行查询,如果记录存在则更新记录,否则插入。
但是,如果没有进行任何更改。我想阻止执行更新命令。
查询:
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');
Table结构:
我要在 Excel 的 VBA 宏中使用这个查询的原因。
通过 Select
查询检索记录。遍历 Range
.
每行:
- 如果没有进行任何更改 - 跳过更新(跳过修改
MODIFIED_BY
和其他可追溯性列)
- 如果存在 - 插入
- 如果有变化 - 更新
我已成功更新和插入记录。那我怎样才能阻止更新呢?
我想你可以使用 WHEN MATCHED AND source.[Key1] <> target.[Key1] AND source.[Key2]<>target.[Key2] THEN
.
如果有帮助,以下是来自 MSDN 的 link:
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');
我正在尝试进行查询,如果记录存在则更新记录,否则插入。
但是,如果没有进行任何更改。我想阻止执行更新命令。
查询:
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');
Table结构:
我要在 Excel 的 VBA 宏中使用这个查询的原因。
通过 Select
查询检索记录。遍历 Range
.
每行:
- 如果没有进行任何更改 - 跳过更新(跳过修改
MODIFIED_BY
和其他可追溯性列) - 如果存在 - 插入
- 如果有变化 - 更新
我已成功更新和插入记录。那我怎样才能阻止更新呢?
我想你可以使用 WHEN MATCHED AND source.[Key1] <> target.[Key1] AND source.[Key2]<>target.[Key2] THEN
.
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');