Я использую Microsoft SQL Server 2005. Мне нужно синхронизировать данные между сервером SQL и базой данных Oracle. Первое, что мне нужно, это выяснить, соответствует ли количество данных на стороне Oracle определенным фильтрам (здесь я использую ID в качестве простого примера).
SELECT COUNT(*) FROM oracleServer..owner.table1 WHERE id = @id;
Проблема, с которой я столкнулся, состоит в том, что таблица на разлинованном сервере или Oracle очень велика с 4M строк данных. Приведенный выше запрос занял около 2 минут, чтобы вернуть данные. Этот код - просто часть. На самом деле мой SP имеет несколько других запросов для обновления, вставки данных с сервера с подкладкой на мой сервер SQL. SP работал часами или более 10 часов, чтобы работать с большой базой данных Oracle. Поэтому T-SQL с разлинованным сервером мне не подходит.
Недавно я обнаружил OPENQUERY и EXEC (...) AT linedServer. OPENQUERY () очень быстро. Потребовалось примерно 0 раз, чтобы получить тот же результат. Однако он не поддерживает запрос переменных или выражения. Запрос должен быть литеральной константной строкой.
EXEC () аналогично для сквозного запроса к Oracle. Это также быстро. Например:
EXEC ('SELECT COUNT(*) FROM owner.table1 WHERE id = ' + CAST(@id AS VARCHAR))
AT oracleServer
Проблема в том, как передать результат COUNT (*) обратно. Я пытался гуглить примеры в Интернете и MSDN. Все, что я могу найти, это примеры SQL или ExpressSQL linedServer, такие как:
EXEC ('SELECT ? = COUNT(*) FROM ...', @myCount OUTPUT) AT expressSQL
Этот запрос не работает для Oracle. Похоже, в Oracle, вы можете установить значение в качестве вывода следующим образом:
SELECT COUNT(*) INTO myCount ...
Я пробовал это:
EXEC ('SELECT COUNT(*) INTO ? FROM ...', @myCount OUTPUT) AT oracleServer
EXEC ('SELECT COUNT(*) INTO : FROM ...', @myCount OUTPUT) AT oracleServer
EXEC ('SELECT : = COUNT(*) FROM ...', @myCount OUTPUT) AT oracleServer
Никто из тех, кто работает. Я получил сообщение об ошибке, в котором говорится, что запрос не выполняется на сервере Oracle.
Я мог бы написать проект .Net SQL Server для выполнения этой работы. До этого мне просто интересно, есть ли способ передать значение в качестве выходного параметра, чтобы я поместил коды T-SQL с большей производительностью в мой SP?