【发布时间】: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