2015-02-11 23 views
0

我需要使用SSIS在Oracle數據庫中進行更新。我使用的是自定義數據庫的任務,並使用類似的查詢:來自SSIS項目的oracle更新查詢中的Varchar2

UPDATE Table SET column1 = ? where KEY = ? 

的關鍵是從SQL Server表中取出並是一個類型爲nvarchar(3),在Oracle數據庫中的關鍵是類型VARCHAR2(3) 。首先,它抱怨,關鍵是4個字符,所以我更改查詢到

UPDATE Table SET column1 = ? where KEY = TRIM(CAST(? AS VARCHAR(3))) 

它正在爲它具有3個字符鍵,但也有2個字符長之一。我試過修剪它,將其轉換。但我不能讓它爲2個字符的鍵。

用於char的Oracle chararcter集合是AL32UTF8,用於NCHAR - AL16UTF16。

+0

你確定其中一個系統沒有填充空間或什麼?如果你直接在兩個數據庫中選擇key ='12',那麼那些看起來是2的,你會同時得到結果嗎?如果你對那些看起來是2的長度做了長短,你會得到3的長度嗎? – xQbert 2015-02-11 19:47:31

+0

直接在oracle中運行的查詢進行更新。所以oracle中的鍵沒有空格。對於SQL Server中的源代碼,我已經檢查了長度,並且在更新步驟之前它是2個字符長。我也試過KEY = TRIM(CAST(?AS VARCHAR(3))),但它也不起作用。 – swist 2015-02-11 19:58:11

+0

是否有可能來自SQL Server的字符在Oracle中佔用多個字節,因此不適合?例如,如果Oracle數據庫的字符集設置爲AL32UTF8,則每個字符可以佔用1到4個字節,7位ASCII字符佔用一個字節,其他所有數據都會佔用更多。默認情況下'varchar2(3)'是'varchar(3字節)'而不是'varchar(3 char)'。 SQL Server的nvarchar上的每個字符都是16位UNICODE字符或代理對的一半。如果SQL Server有兩個非ASCII字符,在這種情況下,它可能會在Oracle上變爲4(或更多)字節。 – 2015-02-11 21:11:32

回答

0

我已經通過在更新步驟之前創建帶有KEY_LEN的派生列作爲LEN(key)來解決問題。然後我用它作爲第三參數更新:

UPDATE Table SET column1 = ? where KEY = SUBSTR(?,0,?)