我正在使用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
答案 0 :(得分:0)
我怀疑答案可能是两种格式使用单独的会话/连接。
返回500的那个使用与INSERT相同的语法,因此很可能在相同的连接/会话下运行。这意味着它将包括该会话插入但未提交的记录。
返回200的其他人可能正在建立一个单独的会话,但没有看到未提交的插入。
简而言之,根据您对“正确”的定义,它们都是“正确的”