Сравнение таблицы Oracle с таблицей SQL Server - PullRequest
0 голосов
/ 18 декабря 2010

Я ищу эффективный способ сравнения данных между таблицей Oracle и SQL Server.У меня нет контроля над таблицей Oracle, и я могу выполнять только отдельные запросы.Эта таблица содержит более 30 000 строк.В настоящее время я создаю набор данных из таблицы Oracle, а затем сравниваю данные с таблицей SQL Server, которую я поддерживаю.В этом случае я просто проверяю наличие номера студента в таблице SQL Server.В тех случаях, когда номер отсутствует, я вставляю его в таблицу SQL Server.Это, как вы можете себе представить, ужасно неэффективно.Будем благодарны за ваши предложения и примеры.

Ответы [ 4 ]

2 голосов
/ 18 декабря 2010

Создайте экземпляр связанного сервера на SQL Server, используя учетную запись, которая имеет доступ к экземпляру Oracle.

Затем вы можете обновить таблицу 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 и NOT EXISTS работают лучше, чем LEFT JOIN / IS NULL, когда сравниваемые столбцы (в данном случае student_number)не обнуляемый (значение никогда не может быть НЕДЕЙСТВИТЕЛЬНЫМ) .

можно легко записать в сценарий как задание агента SQL Server, если вам нужно его периодически запускать .

1 голос
/ 18 декабря 2010

Достаточно простого пакета служб SSIS. Напишите задачу потока данных, которая будет получать данные из Oracle и SQLServer, элемента управления поиском, который будет сравнивать их, обновлять при сбое и вставлять при успехе. Служба SSIS разработана для быстрой и эффективной работы.

0 голосов
/ 21 декабря 2010

Спасибо всем за ваши идеи.OMG Ponies, вы получаете чек, потому что это правильное решение для того, что мне нужно.Однако серверы не связаны.Поэтому мне пришлось написать обходной путь, используя linq.

Сначала я преобразовал набор данных oracle в объект:

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

Затем я написал класс сравнения и вернул разницу:

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();
}

Отлично сработало и я снова счастливый человек.

0 голосов
/ 18 декабря 2010

Я не уверен, что это хороший ответ, так как мне трудно понять, о чем вы просите, но я лично переложил бы нагрузку на обработку на СУРБД. Поэтому вместо этого вы должны алгоритмически создать один оператор выбора, который будет возвращать только соответствующие значения.

Это можно сделать с помощью оператора 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(")");

По общему признанию, это оператор ОГРОМНЫЙ , и я не уверен, позволено ли ему быть настолько большим (и я не уверен в синтаксисе в Oracle, я ненавижу адаптировать свою работу для клиентов Oracle), но я думаю, что СУБД была бы лучше оптимизирована для выполнения всей этой работы по сортировке за вас. Если вы сможете выполнить этот оператор, вы получите только те значения, которые находятся в OracleDB, а НЕ в вашей собственной БД.

Теперь вы можете использовать этот список для генерации только соответствующих операторов вставки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...