MSSQL数据类型转换

时间:2017-02-17 15:07:39

标签: sql-server oracle stored-procedures synchronization type-conversion

我有一对数据库(一个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。

2 个答案:

答案 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等?

相关问题