【问题标题】:Migration Oracle to SQL Server将 Oracle 迁移到 SQL Server
【发布时间】:2018-11-26 03:35:52
【问题描述】:

我们已将 Oracle 数据库转换为 SQL Server。我们正面临 null 与空白的问题。

场景:

在甲骨文中:

Create table Student 
(
      Sno int, 
      FName varchar(20) not null, 
      MName varchar(30) null,
      Lname varchar(20) not null
)

Insert into Student (Sno, Fname, Mname, Lname) 
values (10, 'James' , '', 'Clark')

记录被插入到 Oracle 中,MName 被存储为 null,即使我们传递一个空白字符串 ('') 作为值。

10,James,null,Clark 

但是,插入到 SQL Server 中的行有MName 存储为空白字符串,显示表中的空白空间,即使我们有默认约束。

10,James,,Clark

我们希望将插入 SQL Server 表的空白字符串 ('') 处理为 null,这与 Oracle 数据库的行为类似。

【问题讨论】:

  • 你是如何构建这些插入语句的?
  • 最好更改插入查询,但您可以在表上创建触发器以将零长度字符串值更新为NULL。触发器方法可能是在 SQL Server 中模拟非 ANSI SQL Oracle 行为的最简单方法。
  • @Dan Guzman:我可能错了,但我对在这种情况下使用触发器的建议感到有点惊讶。他们正计划迁移整个数据库,我认为 OP 的关注点可能不仅仅在于该表中的单个列,这可能意味着使用多个触发器?是否建议在他们的迁移工具/脚本中解决这个问题,该工具/脚本为空列放置空白字符串,同时从 Oracle 检索?
  • @KaushikNayak,我的理解是迁移到 SQL Server 已经完成。问题在于应用程序INSERT 查询指定一个空字符串来存储NULL 值。触发方法将避免更改应用程序代码,但仅作为一种解决方法,直到可以更改应用程序代码。

标签: sql-server oracle


【解决方案1】:

处理此问题的一种方法是使用NULLIF() 函数。在您的示例 INSERT 语句中,您可以说

Insert into Student(Sno,Fname,Mname,Lname)
  values (@varSno,@varFname ,NULLIF(@varMname, ''),@varLname)

在 UPDATE 中可能会像这样使用

UPDATE STUDENT
  SET Fname = @varFname,
      Mname = NULLIF(@varMname, ''),
      Lname = @varLname
  WHERE Sno = @varSno

祝你好运。

【讨论】:

  • 请注意,这也会将包含所有空格的字符串更改为 NULL,而不仅仅是空字符串。
猜你喜欢
  • 1970-01-01
  • 2020-07-06
  • 2018-04-07
  • 2015-04-17
  • 2010-10-14
  • 2018-11-28
  • 2012-07-07
  • 2014-02-09
  • 2011-06-09
相关资源
最近更新 更多