我有一對數據庫(一個mssql和一個oracle),由不同的團隊運行。現在有些數據正在通過mssql表中的存儲過程定期進行同步。此存儲過程調用一個非常大的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
現在,甲骨文隊今天推出了重大更改,出於某種原因,改變了列的類型爲字符串,現在在列中具有值NULL, "", "ALFA", "BRAVO"
...。當然,同步被破壞了。
在這裏修復同步最簡單的方法是什麼?我(Mysql團隊負責人,前端專家,但在數據庫中並非如此)通常會應用我們的數據庫專家人員之一,但他們現在都生病了,並且修補程序必須今天上線......
我認爲的存儲過程,如CONVERT_BROKENFIELD_INT_TO_STRING
左右,基於某些switch-case,可以在該合併語句中調用,但不知道該怎麼做。
編輯/澄清:
我需要的是一種方法,使的SQL代碼(存儲過程)的組塊,以「ALFA」的輸入,並返回1,「BRAVO」 - ,> 2等並且可以重複使用,以避免在多個地方寫入巨大的ifs。
你將需要更改列的數據類型的SQL Server數據庫。它需要是一個(n)varchar(SomeSize)。它取決於Oracle端的列的大小,以確保它可以容納所有數據。 –
如果可能,我很樂意避免這種情況。它需要大量重構mssql上的軟件。我今天需要在線修復,並且在一家大公司使用的100000 LOC軟件中進行這樣的更改只能在固定發佈日期進行,並至少進行3個月的測試。 –
那麼你不能像ALFA那樣插入字符串到數字列中。你可以用一個case表達式來包裝這個列,並且當它不是一個有效的數字時就插入NULL。但是你正在做的是從一個曾經是數字的來源獲取數據,而不再是一個數字,並將該數值插入到數字列中。這些值必須是數字,否則將失敗。 –