我必须编写一个组件来在 Oracle 数据库中重新创建 SQL Server 表(结构和数据)。该组件还必须获取输入 Oracle 数据库的新数据并将其复制回 SQL Server。
将数据类型从 SQL Server 转换为 Oracle 不是问题。然而,Oracle 和 SQL Server 之间的一个关键差异引起了严重的头痛。 SQL Server 认为空白字符串 ("") 与 NULL
值不同,因此 char
列可以定义为 NOT NULL
并但数据中仍包含空白字符串。
Oracle 认为空白字符串与 NULL
值相同,因此如果 char
列定义为 NOT NULL
,则无法插入空白字符串。每当 NOT NULL
字符列在原始 SQL Server 数据中包含空白字符串时,这都会导致我的组件中断。
到目前为止,我的解决方案是不在我的任何镜像 Oracle 表定义中使用 NOT NULL
,但我需要一个更强大的解决方案。这必须是一个代码解决方案,因此答案不能是“使用某某的 SQL2Oracle 产品”。
你会如何解决这个问题?
编辑:这是迄今为止我提出的唯一解决方案,它可能有助于说明问题。因为 Oracle 不允许在 NOT NULL 列中使用“”,所以我的组件可以拦截来自 SQL Server 的任何此类值并将其替换为“@”(仅作为示例)。
当我向 Oracle 表中添加新记录时,如果我确实想插入“”,我的代码必须编写“@”,并且当我的代码将新行复制回 SQL Server 时,它必须拦截“@”,而不是写“”。
我希望有一种更优雅的方式。
编辑2:是否有可能有一个更简单的解决方案,例如Oracle中的某些设置,可以使其像所有其他主要数据库一样对待空白字符串?此设置在 Oracle Lite 中也可用吗?
最佳答案
我没有看到一个简单的解决方案。
也许您可以将值存储为一个或多个空白 -> ' '
(在 Oracle 中这些值不是 NULL),或者通过额外的字段/表和适配器来跟踪这种特殊情况层。
关于sql-server - Oracle 将空字符串视为 NULL,而 SQL Server 则不然 - 如何最好地处理这种情况?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/160904/