Ошибка связанного сервера на счетчике (*) записей? - PullRequest
2 голосов
/ 30 марта 2011

Я использую SQL Server 2008 и имею связанный сервер с БД Oracle.Обе БД находятся на моем локальном компьютере с использованием Win 7.

Очень интересно, что count (*) не работает для одного синтаксиса, но работает в другом синтаксисе.

Я запускаю следующий оператор SQL вSQL Server Management Studio.

select COUNT(*) from openquery([hr2_major], 'select * from user_tables'); -- result is 106
select COUNT(*) from [hr2_major]...user_tables; -- result is 106
exec('select count(*) from user_tables') at [hr2_major]; --result is 206

Результаты разные!

Кто-нибудь знает, что не так с первыми двумя операторами?

Спасибо


Обновление

То, что я делаю, - это перенос данных с сервера SQL в Oracle и проверка количества записей всех таблиц на заключительном этапе.

С третьим утверждением мы могли бы делать такие вещикак

declare @recordCount int;
declare @countTable table(c int);
insert into @countTable exec('select count(*) from user_tables') at [hr2_major];
select @recordCount = c from @countTable;

Однако он работает только если MSDTC включен .В противном случае исключение будет выдано в операторе insert.Из-за ограничения привилегий я не могу включить MSDTC на сервере.Поэтому третье утверждение не может использоваться.

Поэтому мой вопрос заключается в том, как заставить первое или второе утверждение работать.Спасибо!


Еще одно обновление:

Вот T-SQL для имитации той же проблемы.

exec('drop table test_table') at [hr2_major];
exec('create table test_table(col1 int)') at [hr2_major];
declare @i int;
declare @sql varchar(8000);
set @i = 0;
while @i < 500
begin
    set @sql = 'insert into test_table(col1) values(' + CONVERT(varchar(10), @i) + ')';
    exec(@sql) at [hr2_major];
    set @i = @i + 1;
end
select COUNT(*) from [hr2_major]...test_table  -- result is 200
select COUNT(*) from openquery([hr2_major], 'select * from test_table') -- result is 200
exec('select count(*) from test_table') at [hr2_major] -- result is 500

1 Ответ

0 голосов
/ 30 марта 2011

Я подозреваю, что ответ может заключаться в том, что два формата используют отдельные сеансы / соединения.

В том, который возвращает 500, используется тот же синтаксис, что и в INSERT, поэтому он, вероятно, будет работать в том же соединении / сеансе,Это означает, что он будет включать записи, которые были вставлены этим сеансом, но не зафиксированы.

Другие, которые возвращают 200, вероятно, устанавливают отдельный сеанс, который не видит незафиксированные вставки.

Короче говоря, они оба «правильные» в зависимости от вашего определения «правильного» * ​​1007 *

...