2011-03-29 3 views
2

SQL Server 2008을 사용하고 있으며 Oracle 서버에 연결된 서버가 있습니다. 두 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 서버에서 데이터를 마이그레이션하고, 최종 단계에서 모든 테이블의 레코드 수를 검증한다하고있는 중이 야. 이 MSDTC가 켜져있는 경우에만 작동하지만 세 번째 문으로

, 우리는

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; 

처럼 같은 일을 할 수 있습니다. 그렇지 않으면 예외가 insert 문에 throw됩니다. 권한 제한으로 인해 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

'간부'의 당신의 정의에 따라 정확한 양 '권리'되어 있고 다른 사람이 잘못인가? 나는 이것을 내일 시험해야 할 것이다. – SQLMason

+0

예 ~ Oracle에는 206 개의 테이블이 있습니다. –

답변

0

나는 대답은 두 가지 형식은 별도의 세션/연결을 사용하고 있다고 할 수있다 생각한다.

500을 반환하는 구문은 INSERT와 동일한 구문을 사용하므로 동일한 연결/세션에서 실행될 수 있습니다. 즉, 해당 세션에서 삽입되었지만 확약되지 않은 레코드가 포함됩니다.

200을 반환하는 다른 사용자는 커밋되지 않은 삽입을 볼 수없는 별도의 세션을 설정하고있을 가능성이 큽니다. 한마디로

, 그들은 '권리'

+0

답변 해 주셔서 감사합니다. 내가 'select * from [hr2_major] ... user_tables'를 실행하려고 할 때 openquery ([hr2_major],'select * from user_tables)'에서'** select ** '를 실행하면 ** 실제로 ** 206 개의 레코드를 제공합니다. 'COUNT (*)'문에서 작동하지 않습니다. –

관련 문제