Oracle认为空字符串为NULL而SQL Server没有 - 这最好如何处理?

Mus*_*sis 20 sql-server oracle

我必须编写一个在Oracle数据库中重新创建SQL Server表(结构和数据)的组件.该组件还必须将新数据输入Oracle数据库并将其复制回SQL Server.

将数据类型从SQL Server转换为Oracle不是问题.但是,Oracle和SQL Server之间的一个重要区别正在引起严重的问题.SQL Server认为空字符串("")与NULL值不同,因此char可以将列定义为NOT NULL但仍包含数据中的空字符串.

Oracle认为空字符串与NULL值相同,因此如果将char列定义为NOT NULL,则无法插入空字符串.每当NOT NULLchar列在原始SQL Server数据中包含空字符串时,这会导致我的组件中断.

到目前为止,我的解决方案是不在NOT NULL我的任何镜像Oracle表定义中使用,但我需要一个更强大的解决方案.这必须是一个代码解决方案,所以答案不能是"使用某某的SQL2Oracle产品".

你会如何解决这个问题?

编辑:这是迄今为止我提出的唯一解决方案,它可能有助于说明问题.由于Oracle在NOT NULL列中不允许使用"",因此我的组件可以拦截来自SQL Server的任何此类值并将其替换为"@"(仅作为示例).

当我向Oracle表添加新记录时,如果我真的想插入"",我的代码必须写"@",当我的代码将新行复制回SQL Server时,它必须截取"@"而是写"".

我希望有一种更优雅的方式.

编辑2:是否有可能有一个更简单的解决方案,比如Oracle中的一些设置可以让它处理与所有其他主要数据库相同的空白字符串?这个设置也可以在Oracle Lite中使用吗?

Cam*_*pka 10

我没有看到一个简单的解决方案.

也许您可以将值存储为一个或多个空白-> ' ',这些空白不是Oracle中的NULLS,或者通过额外的字段/表和适配器层跟踪这种特殊情况.


Dr8*_*r8k 9

我的典型解决方案是在SQL Server中添加约束,强制受影响列中的所有字符串值的长度大于0:

CREATE TABLE Example (StringColumn VARCHAR(10) NOT NULL)

ALTER TABLE Example
ADD CONSTRAINT CK_Example_StringColumn CHECK (LEN(StringColumn) > 0)
Run Code Online (Sandbox Code Playgroud)

但是,正如您所说,您无法控制SQL数据库.因此,你真的有四个选择(我认为):

  1. 将空字符串值视为无效,跳过这些记录,提醒操作员并以某种方式记录记录,以便于手动更正/重新输入.
  2. 将空字符串值转换为空格.
  3. 将空字符串值转换为代码(即"LEGACY"或"EMPTY").
  4. 在这些列中遇到空字符串值的回滚传输,然后对SQL Server数据库所有者施加压力以更正其数据.

第四是我的偏好,但并非总是可行.你采取的行动将取决于oracle用户需要什么.最后,如果无法对SQL数据库做任何事情,我会向oracle业务系统所有者解释这个问题,解释选项和结果并让他们做出决定:)

注意:我相信在这种情况下SQL Server实际上表现出"正确"的行为.