개발
[DB] OPENQUERY(Transact-SQL)
날아가는 된장잠자리
2010. 8. 19. 11:07
지정한 연결된 서버에서 지정한 통과 쿼리를 실행합니다. 이 서버는 OLE DB 데이터 원본입니다. OPENQUERY는 테이블 이름처럼 쿼리의 FROM 절에서 참조될 수 있습니다. 또한 OPENQUERY는 INSERT, UPDATE 또는 DELETE 문의 대상 테이블로 참조될 수도 있습니다. 이것은 OLE DB 공급자 기능에 종속됩니다. 쿼리는 여러 결과 집합을 반환할 수 있지만 OPENQUERY는 첫 번째 것만 반환합니다.
구문
주의
OPENQUERY는 변수를 인수로 받아들이지 않습니다.
OPENQUERY는 연결된 서버에서 확장 저장 프로시저를 실행하는 데 사용할 수 없습니다. 그러나 확장 저장 프로시저는 네 부분으로 된 이름을 사용하여 연결된 서버에서 실행할 수 있습니다. 예를 들면 다음과 같습니다.
예
1. SELECT 통과 쿼리 실행
다음 예에서는 Microsoft OLE DB Provider for Oracle을 사용하여 Oracle 데이터베이스에 대해 OracleSvr
이라는 연결된 서버를 만듭니다. 그런 다음 이 연결된 서버에 대해 SELECT
통과 쿼리를 사용합니다.
![]() |
---|
이 예에서는 ORCLDB 라는 Oracle 데이터베이스 별칭이 생성되어 있다고 가정합니다. |
EXEC sp_addlinkedserver 'OracleSvr', 'Oracle 7.3', 'MSDAORA', 'ORCLDB' GO SELECT * FROM OPENQUERY(OracleSvr, 'SELECT name, id FROM joe.titles') GO
2. UPDATE 통과 쿼리 실행
다음 예에서는 예 1에서 만든 연결된 서버에 대해 UPDATE
통과 쿼리를 사용합니다.
UPDATE OPENQUERY (OracleSvr, 'SELECT name FROM joe.titles WHERE id = 101') SET name = 'ADifferentName';
3. INSERT 통과 쿼리 실행
다음 예에서는 예 1에서 만든 연결된 서버에 대해 INSERT
통과 쿼리를 사용합니다.
INSERT OPENQUERY (OracleSvr, 'SELECT name FROM joe.titles') VALUES ('NewTitle');
4. DELETE 통과 쿼리 실행
다음 예에서는 DELETE
통과 쿼리를 사용하여 예 3에서 삽입된 행을 삭제합니다.
DELETE OPENQUERY (OracleSvr, 'SELECT name FROM joe.titles WHERE name = ''NewTitle''');
----------------------------------------------------------------------------------------
위의 글은 http://msdn.microsoft.com/ko-kr/library/ms188427.aspx 에서 발췌한 글입니다.
OPENQUERY가 변수를 받아들이지 않는다는 부분인 맘에 들지 않는다.
대부분 변수값을 주고 특정 데이터만 받아와서 처리하려고 하는 경우가 많기 때문이다.
이럴 땐 동적쿼리로 만들어서 처리해 주어야 한다.
예:
DECLARE @t VARCHAR(4000), @Eid INT
SET @Eid=1
SET @t =' DELETE OPENQUERY(SQL00,
''SELECT EmployeeID FROM Employees
WHERE EmployeeID >' + CONVERT(VARCHAR(30),@Eid) + ''')'
EXEC (@t)