Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Одно и то же представление возвращает разные данные, если выполнить из Oracle и из MSSQL  [new]
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]     Ответить | Цитировать Сообщить модератору
 Re: Одно и то же представление возвращает разные данные, если выполнить из Oracle и из MSSQL  [new]
Glory
Member

Откуда:
Сообщений: 104751
И вы покажите запрос, который вы выполняете на стороне MSSQL ?
И вы покажите запрос, который приходит на сторону Oracle ?
1 июн 14, 15:49    [16102629]     Ответить | Цитировать Сообщить модератору
 Re: Одно и то же представление возвращает разные данные, если выполнить из Oracle и из MSSQL  [new]
wflow
Member

Откуда:
Сообщений: 38
Glory,

На стороне Oracle структуру представления я привёл. Там оно отрабатывает верно.
На стороне MSSQL выполняется запрос:
sect * from DEV..IBS.AAA
или же
select count(1) from DEV..IBS.AAA
1 июн 14, 15:55    [16102652]     Ответить | Цитировать Сообщить модератору
 Re: Одно и то же представление возвращает разные данные, если выполнить из Oracle и из MSSQL  [new]
Glory
Member

Откуда:
Сообщений: 104751
wflow
На стороне Oracle структуру представления я привёл.

Структура представления - это не то же самоое, что текст запроса, который клиент присылает серверу на выполнение.
1 июн 14, 15:57    [16102661]     Ответить | Цитировать Сообщить модератору
 Re: Одно и то же представление возвращает разные данные, если выполнить из Oracle и из MSSQL  [new]
wflow
Member

Откуда:
Сообщений: 38
Glory
Структура представления - это не то же самоое, что текст запроса, который клиент присылает серверу на выполнение.

Полный текст представления такой:

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]     Ответить | Цитировать Сообщить модератору
 Re: Одно и то же представление возвращает разные данные, если выполнить из Oracle и из MSSQL  [new]
Glory
Member

Откуда:
Сообщений: 104751
wflow
Полный текст представления такой:

Вы хотите сказать, что MSSQL отсылает вашему Oracle запрос create or replace view VW_AAA as... ?
1 июн 14, 16:42    [16102824]     Ответить | Цитировать Сообщить модератору
 Re: Одно и то же представление возвращает разные данные, если выполнить из Oracle и из MSSQL  [new]
wflow
Member

Откуда:
Сообщений: 38
Glory
Вы хотите сказать, что MSSQL отсылает вашему Oracle запрос create or replace view VW_AAA as... ?

Я хочу сказать (и уже говорил), что MSSQL отсылает ораклу запрос именно такой:
sect * from DEV..IBS.AAA
1 июн 14, 16:47    [16102842]     Ответить | Цитировать Сообщить модератору
 Re: Одно и то же представление возвращает разные данные, если выполнить из Oracle и из MSSQL  [new]
Glory
Member

Откуда:
Сообщений: 104751
wflow
что MSSQL отсылает ораклу запрос именно такой:
sect * from DEV..IBS.AAA

Это то, что вы пишите в Microsoft Management Studio
1 июн 14, 16:49    [16102849]     Ответить | Цитировать Сообщить модератору
 Re: Одно и то же представление возвращает разные данные, если выполнить из Oracle и из MSSQL  [new]
wflow
Member

Откуда:
Сообщений: 38
Ну, если быть до конца точным, то
sect * from DEV..IBS.VW_AAA
1 июн 14, 16:49    [16102851]     Ответить | Цитировать Сообщить модератору
 Re: Одно и то же представление возвращает разные данные, если выполнить из Oracle и из MSSQL  [new]
wflow
Member

Откуда:
Сообщений: 38
Glory
Это то, что вы пишите в Microsoft Management Studio

Да, именно это я и пишу. В МMicrosoft Management Studio тоже.
1 июн 14, 16:51    [16102856]     Ответить | Цитировать Сообщить модератору
 Re: Одно и то же представление возвращает разные данные, если выполнить из Oracle и из MSSQL  [new]
Glory
Member

Откуда:
Сообщений: 104751
wflow
Да, именно это я и пишу. В МMicrosoft Management Studio тоже.

А вы заданный вам вопрос точно читали ? И поняли ?
1 июн 14, 16:52    [16102860]     Ответить | Цитировать Сообщить модератору
 Re: Одно и то же представление возвращает разные данные, если выполнить из Oracle и из MSSQL  [new]
Glory
Member

Откуда:
Сообщений: 104751
select * from openquery(DEV, 'select * from IBS.VW_AAA') a
1 июн 14, 16:53    [16102865]     Ответить | Цитировать Сообщить модератору
 Re: Одно и то же представление возвращает разные данные, если выполнить из Oracle и из MSSQL  [new]
wflow
Member

Откуда:
Сообщений: 38
Glory
select * from openquery(DEV, 'select * from IBS.VW_AAA') a

Так не пробовал. Завтра на работе попытаюсь. Но если я вызываю представление без openquery, то почему происходит то, что я описал?
1 июн 14, 16:58    [16102883]     Ответить | Цитировать Сообщить модератору
 Re: Одно и то же представление возвращает разные данные, если выполнить из Oracle и из MSSQL  [new]
Glory
Member

Откуда:
Сообщений: 104751
wflow
то почему происходит то, что я описал?

Потому, что вы очень примитивно себе представляете общение клиента и сервера.
1 июн 14, 17:00    [16102892]     Ответить | Цитировать Сообщить модератору
 Re: Одно и то же представление возвращает разные данные, если выполнить из Oracle и из MSSQL  [new]
wflow
Member

Откуда:
Сообщений: 38
Glory
wflow
то почему происходит то, что я описал?

Потому, что вы очень примитивно себе представляете общение клиента и сервера.

А по существу вопроса есть что сказать?
1 июн 14, 17:05    [16102914]     Ответить | Цитировать Сообщить модератору
 Re: Одно и то же представление возвращает разные данные, если выполнить из Oracle и из MSSQL  [new]
Glory
Member

Откуда:
Сообщений: 104751
wflow
А по существу вопроса есть что сказать?

По какому существу, если вы не может различить текст представления, от текста набираемого в клиентском приложении и событиях, происходящих на сервере
Вот вы мониторили, какие команды передаются Oracle ?
1 июн 14, 17:15    [16102932]     Ответить | Цитировать Сообщить модератору
 Re: Одно и то же представление возвращает разные данные, если выполнить из Oracle и из MSSQL  [new]
wflow
Member

Откуда:
Сообщений: 38
Glory
wflow
А по существу вопроса есть что сказать?

По какому существу, если вы не может различить текст представления, от текста набираемого в клиентском приложении и событиях, происходящих на сервере
Вот вы мониторили, какие команды передаются Oracle ?

Любопытные выводы вы сделали. На этом, думаю, наше общение стоит завершить. Всего доброго.
1 июн 14, 17:19    [16102940]     Ответить | Цитировать Сообщить модератору
 Re: Одно и то же представление возвращает разные данные, если выполнить из Oracle и из MSSQL  [new]
Glory
Member

Откуда:
Сообщений: 104751
wflow
Любопытные выводы вы сделали.

16102629
- И вы покажите запрос, который приходит на сторону Oracle ?
- На стороне Oracle структуру представления я привёл.
16102661
- Структура представления - это не то же самоое, что текст запроса, который клиент присылает серверу на выполнение.
- Полный текст представления такой:
16102824
- Вы хотите сказать, что MSSQL отсылает вашему Oracle запрос create or replace view VW_AAA as... ?
- Я хочу сказать (и уже говорил), что MSSQL отсылает ораклу запрос именно такой:

Интересно, какой вывод можно сделать, если на трижды заданный один вопрос дается трижды неправильный ответ ?
1 июн 14, 17:29    [16102958]     Ответить | Цитировать Сообщить модератору
 Re: Одно и то же представление возвращает разные данные, если выполнить из Oracle и из MSSQL  [new]
wflow
Member

Откуда:
Сообщений: 38
Выполнил с openquery. Результат прежний... Какие будут мнения?
2 июн 14, 09:34    [16104261]     Ответить | Цитировать Сообщить модератору
 Re: Одно и то же представление возвращает разные данные, если выполнить из Oracle и из MSSQL  [new]
invm
Member

Откуда: Москва
Сообщений: 9913
wflow
Какие будут мнения?
Текст запроса, приходящий на оракл вы упорно не желаете показывать. Остается только гадать:
1. Вы обращаетесь не к тому серверу.
2. В схеме IBS проживает совсем другое представление, нежели показанное нам.
2 июн 14, 10:14    [16104368]     Ответить | Цитировать Сообщить модератору
 Re: Одно и то же представление возвращает разные данные, если выполнить из Oracle и из MSSQL  [new]
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]     Ответить | Цитировать Сообщить модератору
 Re: Одно и то же представление возвращает разные данные, если выполнить из Oracle и из MSSQL  [new]
iap
Member

Откуда: Москва
Сообщений: 47198
wflow,

Может, сначала в MSSQL выполнить SET NOCOUNT ON ???
2 июн 14, 13:32    [16105993]     Ответить | Цитировать Сообщить модератору
 Re: Одно и то же представление возвращает разные данные, если выполнить из Oracle и из MSSQL  [new]
iap
Member

Откуда: Москва
Сообщений: 47198
iap
wflow,

Может, сначала в MSSQL выполнить SET NOCOUNT ON ???
Хотя, это только теоретическая догадка.
И Oracle у меня нет и никогда не было... :))
2 июн 14, 13:33    [16106001]     Ответить | Цитировать Сообщить модератору
 Re: Одно и то же представление возвращает разные данные, если выполнить из Oracle и из MSSQL  [new]
Glory
Member

Откуда:
Сообщений: 104751
wflow
Какие будут соображения?

Отследить, что происходит на стороне Оracle
Или вы думаете, что MSSQL напрямую читает данные из файлов базы Оracle ?
2 июн 14, 13:37    [16106052]     Ответить | Цитировать Сообщить модератору
 Re: Одно и то же представление возвращает разные данные, если выполнить из Oracle и из MSSQL  [new]
wflow
Member

Откуда:
Сообщений: 38
iap
wflow,

Может, сначала в MSSQL выполнить SET NOCOUNT ON ???

Выполнил. Не помогает...
2 июн 14, 13:38    [16106054]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить