2014-02-24 3 views
0

질문이 새로 생겼지 만 몇 년 동안 Stackoverflow를 사용 해왔다.하나의 OpenQuery에서 다른 OpenQuery로 변수 목록 전달

나는 서로 이야기하지 않는 두 개의 개별적으로 연결된 서버를 가지고 있습니다. 한 서버에서 SQL로 변수 목록을 가져온 다음 해당 서버의 데이터를 SQL로 가져 오는 최종 목표로 두 번째 OpenQuery에 해당 변수 목록을 전달해야합니다. 하나의 변수에 키를 전달할 수있었습니다. 그러나 문자열 식 OpenQuery 또는 문자열 쿼리를 사용하려고하면 오류가 반환됩니다. 누군가 올바른 방향으로 나를 가리킬 수 있습니까?

현재 쿼리 : 당신이 줄 수있는 모든 지원이 크게 감상 할 수

DECLARE @string VARCHAR(MAX) 
,  @SQL NVARCHAR(MAX); 

SET @string = 
' 
Select 
    col1  
from 
    OpenQuery(server1, ''Select col1 from table1 where col2 = '''' a '''' 
    '; 
SET @SQL = 'SELECT * FROM OPENQUERY(Server2, ''SELECT * FROM table2 WHERE col1 = ''''' + @string + ''''' '')'; 


EXEC sp_executesql @string; 

.

2008 년 SQL 서버에서 실행되는 SSMS 2012를 사용하고 있습니다. 연결된 두 개의 서버는 원격으로 연결할 수없는 Oracle 서버입니다.

답변

0

하나의 오픈 쿼리를 다른 서버 내에 중첩하면 server2에 server1에 대한 열기 쿼리를 실행하게됩니다. @string을 @sql에 중첩시키고 있지만 @sql이 아닌 @string을 실행한다는 점에서 위의 오류가 있습니다.

비교적 작은 수익률을 기대한다면 임시 테이블을 사용하여 server1의 데이터를 보유한 다음이를 사용하여 server2의 반환 값을 필터링하는 것이 좋습니다. 서버 2의 리턴이 큰 경우

IF OBJECT_ID('TEMPDB..#TMP') IS NOT NULL 
    DROP TABLE #TMP 

SELECT COL1 
INTO #TMP 
FROM OPENQUERY(SERVER1, 'SELECT COL1 FROM TABLE1 WHERE COL2 = ''A''') 

SELECT * 
FROM OPENQUERY(SERVER2, 'SELECT * FROM TABLE2') 
WHERE COL1 IN (SELECT COL1 FROM #TMP) 

은 후속 편집으로, 당신은 당신이 와이어를 통해 방대한 양의 데이터를 전송하지 않을 있도록 로컬 서버에 반환하기 전에 필터링을 고려해야합니다. 이 경우 #tmp의 값을 쉼표로 구분 된 문자열로 변환하고 두 번째 openquery 변수에 중첩하여 sp_executesql로 실행합니다. 다음은 쉼표로 구분 된 목록으로 열을 변환 할 때 큰 SO post입니다.

+0

응답 해 주셔서 감사합니다. 원래 실행을 바꿨습니다. 나는 반복을 붙여 넣었습니다. 19. 불행히도 서버 1 (내 인구)에서 약 1 백만 개의 레코드를 반환하고 서버 2 (데이터)에서 데이터를 가져 왔습니다. 내 데이터 서버에 약 1,600 만 레코드가 있습니다 – Dacius

+0

두 개의 Oracle 소스에 대해 MSSQL에서 쉽게이를 수행 할 수있는 방법은 없습니다. 최선의 접근 방식은 Server2에서 호출 할 수있는 proc를 갖는 것입니다. 만약 당신이 절대적으로 MSSQL을 사용해야한다면, Server1에서 #tmp로 select를 실행 한 다음 결과 #tmp 데이터를 Server2에 삽입하여 Oracle 사용자 테이블에 삽입합니다 (인덱싱 됨). 그런 다음 OpenQuery를 통해 Server2에서 선택하고 Server2에있는 새 사용자 테이블로 필터링 할 수 있습니다. – JiggsJedi