【问题标题】:Comparing Oracle Table with SQL Server table比较 Oracle 表和 SQL Server 表
【发布时间】:2010-12-17 21:41:28
【问题描述】:

我正在寻找一种有效的方法来比较 Oracle 和 SQL Server 表之间的数据。我无法控制 Oracle 表,只能执行选择查询。此表包含 30,000 多行。目前我从 Oracle 表创建一个数据集,然后将数据与我维护的 SQL Server 表进行比较。在这种情况下,我只是检查 SQL Server 表中是否存在学生编号。如果数字不存在,我将其插入 SQL Server 表中。正如您可以想象的那样,这是非常低效的。您的建议和示例将不胜感激。

【问题讨论】:

  • 1. SQL 是一种查询语言。你是说 SQL Server 吗? 2. 什么你想做什么?你已经描述了如何你是如何做到的。
  • SQL 服务器。最终目标是执行一个早报,只捕获oracle表中的新生,然后将它们复制到我的sql server表中。

标签: c# sql-server oracle webforms


【解决方案1】:

使用对 Oracle 实例具有访问权限的帐户在 SQL Server 上创建 Linked Server instance

然后,您可以使用以下方法使用缺失的内容更新 SQL Server 表:

INSERT INTO [SQLServer].[dbo].[table]
SELECT columns
  FROM [Oracle].[database].[schema].[table] x
 WHERE NOT EXISTS(SELECT NULL
                    FROM [SQLServer].[dbo].[table] y
                   WHERE y.student_number = x.student_number)

有 NOT IN 和 LEFT JOIN/IS NULL 替代方案 -- NOT IN and NOT EXISTS perform better than LEFT JOIN/IS NULL when the columns compared (in this case, student_number) is not nullable (the value can never be NULL)

script this as a SQL Server Agent Job if you need it to run periodically 很容易。

【讨论】:

  • +1。我尝试了这样的方法,但是当涉及 CLOB 列时它不起作用。我不知道这是否是由某些代码页不兼容引起的,还是 OLEDB 的一般限制(链接服务器似乎使用 OLEDB)。没有那些有问题的列,它工作得很好。
  • 这看起来可行,但它是否需要在服务器上进行额外的设置/配置。我无法控制这些。
【解决方案2】:

一个简单的 SSIS 包就足够了。编写一个从 Oracle 和 SQLServer 获取数据的数据流任务,这是一个查找控件,可以在它们之间进行比较并在失败时更新并在成功时插入。 SSIS 的设计非常快速和高效。

【讨论】:

  • 正是我正在输入的内容,但您击败了我输入回车键。使用包,您可以安排它每天在报表运行之前的某个时间运行。
【解决方案3】:

我不确定这是否是一个好的答案,因为我很难看到您的要求,但我个人会将处理负担转移到 RDBMS 上。因此,您将创建一个仅返回相关值的算法选择语句。

这可以使用NOT IN sql 运算符来完成。

所以开始你的字符串,但是你通常会......

String statement = "SELECT * FROM OracleDB where StudentID NOT IN (";
foreach (val in StudentIDValuesFromYourDB)
{
    statement = statement.concat(val + ", ");
}
statement = statement.substring(0,statement.length()-2);//remove the extra comma
statement = statement.concat(")");

诚然,这是一个 HUGE 声明,我不确定它是否允许那么大(我也不确定 Oracle 中的语法,我讨厌为 Oracle 客户调整我的工作) ,但我认为 RDBMS 会更好地为您完成所有这些排序工作。如果您可以运行此语句,您将只能获得 OracleDB 中的值,而不是您自己的 DB 中的值。

您现在可以使用此列表仅生成相关的插入语句。

【讨论】:

  • Nope too 声明太大。但感谢您的建议。
【解决方案4】:

感谢大家的想法。 OMG Ponies,你得到了支票,因为它是我需要的正确解决方案。但是,服务器未链接。所以我不得不使用 linq 写一个变通方法。

首先我将oracle数据集转化为一个对象:

List<Student> studentList = new List<Student>();
studentList = (from d in dataSet
    select new Student
    {
        StudentNumber = d.STUDENTNUMBER,
        .... other properties
    }).ToList();

然后我写了一个comparer class 并返回了差异:

public IEnumerable<Student> ListNewStudents(IEnumerable<Student> studentList)
{

    List<Student> otherStudentList = (from s in _dataContext.Students
         select new Student
         {
             StudentNumber = s.StudentNumber
         }).ToList();

    return studentList.Except(otherStudentList, new StudentComparer()).ToList();
}

工作完美,我又是一个快乐的人。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-08-31
    • 2011-06-03
    • 2012-08-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-27
    • 1970-01-01
    相关资源
    最近更新 更多