【问题标题】:Varchar2 in oracle update query from SSIS project来自 SSIS 项目的 oracle 更新查询中的 Varchar2
【发布时间】:2015-02-11 19:40:43
【问题描述】:

我需要使用 SSIS 更新 Oracle 的数据库。我正在使用自定义数据库任务并使用如下查询:

  UPDATE Table SET column1 = ? where KEY = ?

key取自SQL Server表,是nvarchar(3)类型,oracle数据库中key是varchar2(3)类型。首先它抱怨密钥是 4 个字符,所以我将查询更改为

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

它适用于具有 3 个字符的键,但也有 2 个字符长的键。我试过修剪它,转换它。但我不能让它适用于 2 个字符的键。

对于 char 的 Oracle 字符集是 AL32UTF8,对于 NCHAR - AL16UTF16。

【问题讨论】:

  • 您确定其中一个系统没有填充空格或其他东西吗?如果您直接在两个数据库中选择 where key = '12' ,那些看起来是 2 的那些,您两次都得到结果吗?如果你对那些看起来是 2 的长度做一个长度,你会得到 3 的长度吗?
  • 直接在 oracle 中运行的查询会进行更新。所以oracle中的键没有空格。 SQL Server 中的源代码也是如此,我检查了长度,在更新步骤之前它是 2 个字符。我也尝试过 KEY=TRIM(CAST(?AS VARCHAR(3))),但它也不起作用。
  • 来自 SQL Server 的字符是否可能在 Oracle 中占用多个字节,因此不适合?例如,如果 Oracle DB 将字符集设置为 AL32UTF8,则每个 char 可以占用一到四个字节,其中 7 位 ASCII 字符占用一个字节,其他所有字符占用更多。默认情况下,varchar2(3)varchar(3 byte) 而不是 varchar(3 char)。 SQL Server 的 nvarchar 上的每个字符都是 16 位 UNICODE 字符或代理对的一半。如果 SQL Server 有两个非 ascii 字符,在这种情况下,它在 Oracle 上可能变成 4(或更多)字节。
  • 所有键都只使用 ASCI 代码。存在一个问题,即 SSIS 代表 MS SQL varchars 的 DT_WSTR 应该 oracle 的 varchar2 比实际长 2 个字节。

标签: sql-server oracle ssis


【解决方案1】:

我已通过在更新步骤之前创建以 KEY_LEN 作为 LEN(key) 的派生列来解决此问题。然后我在更新中使用它作为第三个参数:

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

【讨论】:

    猜你喜欢
    • 2019-05-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-02
    相关资源
    最近更新 更多