我必须编写一个在Oracle数据库中重新创建SQL Server表(结构和数据)的组件。该组件还必须将新数据输入Oracle数据库并将其复制回SQL Server。Oracle认为空字符串为空,而SQL Server不空 - 这是如何最好地处理?
将数据类型从SQL Server转换为Oracle不是问题。但是,Oracle和SQL Server之间的一个关键差异正在引起很大的头痛。 SQL Server认为空值字符串(“”)与NULL
值不同,因此char
列可以定义为NOT NULL
,但数据中仍包含空白字符串。如果列定义为NOT NULL
,则不能插入空白字符串。每当NOT NULL
字符列在原始SQL Server数据中包含空白字符串时,就会导致组件中断。
到目前为止,我的解决方案是在我的任何镜像Oracle表定义中不使用NOT NULL
,但我需要一个更强大的解决方案。这必须是一个代码解决方案,所以答案不能“使用某某的SQL2Oracle产品”。
你会如何解决这个问题?
编辑:这是我迄今为止唯一提出的解决方案,它可能有助于说明问题。因为Oracle不允许NOT NULL列中的“”,所以我的组件可以拦截来自SQL Server的任何此类值,并将其替换为“@”(仅举个例子)。
当我向Oracle表添加一条新记录时,如果我真的想插入一个“”,我的代码必须写“@”,并且当我的代码将新行复制回SQL Server时,它必须拦截“@”代替写“”。
我希望有一个更优雅的方式。
编辑2:有没有可能有一个更简单的解决方案,就像Oracle中的一些设置可以使它与所有其他主要数据库一样处理空白字符串?此设置是否也可在Oracle Lite中使用?
关于您的编辑2:有一个可怕的解决方案,包括对所有这些列使用CLOB。 Oracle区分NULL和一个空的CLOB。您可以将CLOB内联存储在表中以降低性能影响。我不会这样做(请参阅下面的实际答案)。 – 2011-10-25 06:29:01
@WW .:你是完全正确的 - 这是一个可怕的解决方案。 – MusiGenesis 2011-10-25 13:25:18
圣牛。 SQL Server有它自己的愚蠢分享,但这纯粹是无稽之谈。 (这是否仍然是当前的2014+ Oracle,并且已经为它添加了“ANSI NULL”设置?SQL Server有一些像这样的“ANSI NULL”处理问题。) – user2864740 2015-01-27 16:11:18