我有一对数据库(一个mssql和一个oracle),由不同的团队运行。一些数据现在由mssql表中的存储过程定期同步。这个存储过程正在调用一个非常大的
MERGE [mssqltable].[Mytable] as s
USING THEORACLETABLE.BLA as t
ON t.[R_ID] = s.[R_ID]
WHEN MATCHED THEN UPDATE SET [Field1] = s.[Field1], ..., [Brokenfield] = s.[BrokenField]
WHEN NOT MATCHED BY TARGET THEN
... another big statement
字段Brokenfield
是一个数字版,直到今天,可以取值N ULL, 0, 1, .., 24
现在,由于某些原因,oracle团队今天引入了一个重大变化,将列的类型更改为字符串,现在列中的值为NULL, "", "ALFA", "BRAVO"
....当然,同步被打破了。
在这里修复同步的最简单方法是什么?我(Mysql团队负责人,前端专家但在数据库中不是这样)通常会在这里应用我们的数据库专家,但所有这些人现在都生病了,修复必须在今天上线....
我想到了一个类似CONVERT_BROKENFIELD_INT_TO_STRING
左右的存储过程,基于一些switch-case,可以在该merge语句中调用,但不知道如何做到这一点。
修改/澄清:
我需要的是一种方法来制作一大块SQL代码(存储过程),输入“ALFA”并返回1,“BRAVO” - > 2,等等,可以重复使用,以避免在多个地方写出巨大的ifs。
答案 0 :(得分:2)
如果无法按照@RichardHansell所描述的方式简化正确值的逻辑,则可以为BrokenField
创建一个正确值的人行横道表。然后,您可以使用公共表表达式或带有left join
的子查询到该人行横道,以便在merge
中使用。
create table dbo.BrokenField_Crosswalk (
BrokenField varchar(32) not null primary key
, CorrectedValue int
);
insert into dbo.BrokenField_Crosswalk (BrokenField,CorrectedValue) values
('ALFA', 1)
, ('ALPHA', 1)
, ('BRAVO', 2)
...
go
merge
的代码看起来像这样:
;with cte as (
select o.R_ID
, o.Field1
, BrokenField = cast(isnull(c.CorrectedValue,o.BrokenField) as int)
....
from oracle_table.bla as o
left join dbo.BrokenField_Crosswalk as c
)
merge into [mssqltable].[Mytable] t
using cte as s
on t.[R_ID] = s.[R_ID]
when matched
then update set
[Field1] = s.[Field1]
, ...
, [Brokenfield] = s.[BrokenField]
when not matched by target
then
答案 1 :(得分:0)
如果他们在序列的开头使用带字母的名称:
function testFunction() {
var input = document.getElementById("testInput");
var button = document.getElementById("testButton");
input.style.boxShadow = "0px 0px 5px #ff0000";
setTimeout(function() {
input.style.transition = "box-shadow 5s";
input.style.boxShadow = "0px 0px 0px #000000";
}, 0);
//input.focus();
}
然后你可以这样做:
<input id="testInput"/>
<button id="testButton" onclick="testFunction();">Press me!</button>
编辑:但实际上我重新阅读了您的问题而您正在谈论[Brokenfield]是问题专栏,因此我的解决方案无法运作。
我现在不太了解,因为似乎MERGE语句正在用数字更新oracle表,所以你肯定需要映射以另一种方式工作,即1 - &gt; ALFA,2 - &gt; BETA等?