计数(*)记录上的链接服务器错误?

时间:2011-03-29 23:47:13

标签: oracle sql-server-2008 linked-server

我正在使用SQL Server 2008并将链接服务器连接到Oracle DB。两个DB都在使用Win 7的本地计算机中。

非常有趣的是,count(*)对于一种语法不起作用,但在另一种语法中起作用。

我在SQL Server Management Studio中运行以下SQL语句。

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 :(得分:0)

我怀疑答案可能是两种格式使用单独的会话/连接。

返回500的那个使用与INSERT相同的语法,因此很可能在相同的连接/会话下运行。这意味着它将包括该会话插入但未提交的记录。

返回200的其他人可能正在建立一个单独的会话,但没有看到未提交的插入。

简而言之,根据您对“正确”的定义,它们都是“正确的”