Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / Microsoft SQL Server |
![]() ![]() |
Топик располагается на нескольких страницах: [1] 2 вперед Ctrl→ все |
wflow Member Откуда: Сообщений: 38 |
Представление создано на сервере Oracle. Отрабатывает там правильно. Оно же, вызываемое из MSSQL через связанный сервер, выдаёт большее количество строк. Анализ выдаваемых данных показывает, что в MSSQL возвращаются в том числе "лишние" строки, т.е. те, которые замечательно фильтруются, если представление вызывается из Oracle. Собственно, структура представления примерно такая: create or replace view AAA as select BB. ... from (select ... ,ROW_NUMBER () OVER (PARTITION BY ... ORDER BY ...) as rn from ... ) BB where BB.rn = 1 Так вот этот самый фильтр "where BB.rn = 1" и не отрабатывает при вызове представления через связанный сервер из MSSQL. Возвращаются строки, в которых rn равен и 2 и 3 и т.п. Все, что есть, словом. Соответственно, даже элементарное select count(1) from (это самое представление) возвращает разные числа при запросе из PL/SQL на сервере Oracle и при вызове через связанный сервер со стороны MSSQL сервера. Oracle 11g, MSSQL 2012 r2, провайдер Oracle Provider for OLE DB Вопросов два. В чем причина? Как лечить? Заранее благодарен за пояснения. |
1 июн 14, 15:46 [16102616] Ответить | Цитировать Сообщить модератору |
Glory Member Откуда: Сообщений: 104760 |
И вы покажите запрос, который вы выполняете на стороне MSSQL ? И вы покажите запрос, который приходит на сторону Oracle ? |
1 июн 14, 15:49 [16102629] Ответить | Цитировать Сообщить модератору |
wflow Member Откуда: Сообщений: 38 |
Glory, На стороне Oracle структуру представления я привёл. Там оно отрабатывает верно. На стороне MSSQL выполняется запрос: sect * from DEV..IBS.AAA или же select count(1) from DEV..IBS.AAA |
1 июн 14, 15:55 [16102652] Ответить | Цитировать Сообщить модератору |
Glory Member Откуда: Сообщений: 104760 |
Структура представления - это не то же самоое, что текст запроса, который клиент присылает серверу на выполнение. |
||
1 июн 14, 15:57 [16102661] Ответить | Цитировать Сообщить модератору |
wflow Member Откуда: Сообщений: 38 |
Полный текст представления такой: create or replace view VW_AAA as select rec.id as c_pr_cred_id ,rec.c_cod ,rec.c_date ,abs(sum(rec.c_start_sum)) as c_start_sum ,abs(sum(rec.c_start_sum_nat)) as c_start_sum_nat from (select cr.id ,ta.c_cod ,to_date(r.c_date) as c_date ,r.c_start_sum ,r.c_start_sum_nat ,row_number() over(partition by cr.id, ta.c_cod, af.id, to_date(r.c_date) order by r.id) as rn from z#pr_cred cr join z#product p on cr.id = p.id join z#hoz_op_acc hoa on p.c_array_dog_acc = hoa.collection_id join z#tip_acc ta on hoa.c_name_account = ta.id and ta.c_cod in ( 'ACCOUNT' ,'ACC_DEBTS_CR' ,'ACC_DEBTS_PRC' ,'ACC_RESERV' ,'ACC_RESERV_DEBTS' ,'ACC_DEMAND_PRC' ) join z#ac_fin af on hoa.c_account_dog#1#2 = af.id join z#records r on af.c_arc_move = r.collection_id ) rec where rec.rn = 1 group by rec.id, rec.c_cod, rec.c_date |
||
1 июн 14, 16:15 [16102741] Ответить | Цитировать Сообщить модератору |
Glory Member Откуда: Сообщений: 104760 |
Вы хотите сказать, что MSSQL отсылает вашему Oracle запрос create or replace view VW_AAA as... ? |
||
1 июн 14, 16:42 [16102824] Ответить | Цитировать Сообщить модератору |
wflow Member Откуда: Сообщений: 38 |
Я хочу сказать (и уже говорил), что MSSQL отсылает ораклу запрос именно такой: sect * from DEV..IBS.AAA |
||
1 июн 14, 16:47 [16102842] Ответить | Цитировать Сообщить модератору |
Glory Member Откуда: Сообщений: 104760 |
Это то, что вы пишите в Microsoft Management Studio |
||
1 июн 14, 16:49 [16102849] Ответить | Цитировать Сообщить модератору |
wflow Member Откуда: Сообщений: 38 |
Ну, если быть до конца точным, то sect * from DEV..IBS.VW_AAA |
1 июн 14, 16:49 [16102851] Ответить | Цитировать Сообщить модератору |
wflow Member Откуда: Сообщений: 38 |
Да, именно это я и пишу. В МMicrosoft Management Studio тоже. |
||
1 июн 14, 16:51 [16102856] Ответить | Цитировать Сообщить модератору |
Glory Member Откуда: Сообщений: 104760 |
А вы заданный вам вопрос точно читали ? И поняли ? |
||
1 июн 14, 16:52 [16102860] Ответить | Цитировать Сообщить модератору |
Glory Member Откуда: Сообщений: 104760 |
select * from openquery(DEV, 'select * from IBS.VW_AAA') a |
1 июн 14, 16:53 [16102865] Ответить | Цитировать Сообщить модератору |
wflow Member Откуда: Сообщений: 38 |
Так не пробовал. Завтра на работе попытаюсь. Но если я вызываю представление без openquery, то почему происходит то, что я описал? |
||
1 июн 14, 16:58 [16102883] Ответить | Цитировать Сообщить модератору |
Glory Member Откуда: Сообщений: 104760 |
Потому, что вы очень примитивно себе представляете общение клиента и сервера. |
||
1 июн 14, 17:00 [16102892] Ответить | Цитировать Сообщить модератору |
wflow Member Откуда: Сообщений: 38 |
А по существу вопроса есть что сказать? |
||||
1 июн 14, 17:05 [16102914] Ответить | Цитировать Сообщить модератору |
Glory Member Откуда: Сообщений: 104760 |
По какому существу, если вы не может различить текст представления, от текста набираемого в клиентском приложении и событиях, происходящих на сервере Вот вы мониторили, какие команды передаются Oracle ? |
||
1 июн 14, 17:15 [16102932] Ответить | Цитировать Сообщить модератору |
wflow Member Откуда: Сообщений: 38 |
Любопытные выводы вы сделали. На этом, думаю, наше общение стоит завершить. Всего доброго. |
||||
1 июн 14, 17:19 [16102940] Ответить | Цитировать Сообщить модератору |
Glory Member Откуда: Сообщений: 104760 |
16102629 - И вы покажите запрос, который приходит на сторону Oracle ? - На стороне Oracle структуру представления я привёл. 16102661 - Структура представления - это не то же самоое, что текст запроса, который клиент присылает серверу на выполнение. - Полный текст представления такой: 16102824 - Вы хотите сказать, что MSSQL отсылает вашему Oracle запрос create or replace view VW_AAA as... ? - Я хочу сказать (и уже говорил), что MSSQL отсылает ораклу запрос именно такой: Интересно, какой вывод можно сделать, если на трижды заданный один вопрос дается трижды неправильный ответ ? |
||
1 июн 14, 17:29 [16102958] Ответить | Цитировать Сообщить модератору |
wflow Member Откуда: Сообщений: 38 |
Выполнил с openquery. Результат прежний... Какие будут мнения? |
2 июн 14, 09:34 [16104261] Ответить | Цитировать Сообщить модератору |
invm Member Откуда: Москва Сообщений: 9633 |
1. Вы обращаетесь не к тому серверу. 2. В схеме IBS проживает совсем другое представление, нежели показанное нам. |
||
2 июн 14, 10:14 [16104368] Ответить | Цитировать Сообщить модератору |
wflow Member Откуда: Сообщений: 38 |
Чтобы никто не гадал и сам мог убедиться, вот облегчённый тестовый вариант, который любой может за минуту у себя протестировать так, как ему захочется. На стороне Oracle: 1. Создали таблицу: CREATE TABLE Z#TT (id number, dt date, val number); 2. Заполнили таблицу: begin insert into Z#TT values (1, to_timestamp('2013/12/13 10:13:00', 'YYYY/MM/DD HH:MI:SS'), 1000); insert into Z#TT values (2, to_timestamp('2013/12/13 10:13:10', 'YYYY/MM/DD HH:MI:SS'), 100); insert into Z#TT values (4, to_timestamp('2014/01/01 12:12:12', 'YYYY/MM/DD HH:MI:SS'), 1); end; 3. Создали представление: create or replace view VW_TEST as select BB.dt2, sum(BB.val) as sum_val from (select dt ,to_date(dt) as dt2 ,val ,row_number() over(partition by to_date(dt) order by id) as rn from Z#TT ) BB where BB.rn = 1 group by BB.dt2 4. Выполнили, убедились в правильном результате: select * from VW_TEST или select count(1) from VW_TEST -- вернёт 2, как и должен Теперь на стороне MSSQL: select * from openquery(DEV, 'select * from VW_TEST') или select * from openquery(DEV, 'select count(1) from VW_TEST') -- вернёт 3 ??? Какие будут соображения? |
2 июн 14, 13:29 [16105964] Ответить | Цитировать Сообщить модератору |
iap Member Откуда: Москва Сообщений: 47047 |
wflow, Может, сначала в MSSQL выполнить SET NOCOUNT ON ??? |
2 июн 14, 13:32 [16105993] Ответить | Цитировать Сообщить модератору |
iap Member Откуда: Москва Сообщений: 47047 |
И Oracle у меня нет и никогда не было... :)) |
||
2 июн 14, 13:33 [16106001] Ответить | Цитировать Сообщить модератору |
Glory Member Откуда: Сообщений: 104760 |
Отследить, что происходит на стороне Оracle Или вы думаете, что MSSQL напрямую читает данные из файлов базы Оracle ? |
||
2 июн 14, 13:37 [16106052] Ответить | Цитировать Сообщить модератору |
wflow Member Откуда: Сообщений: 38 |
Выполнил. Не помогает... |
||
2 июн 14, 13:38 [16106054] Ответить | Цитировать Сообщить модератору |
Топик располагается на нескольких страницах: [1] 2 вперед Ctrl→ все |
Все форумы / Microsoft SQL Server | ![]() |