본문 바로가기

프로그래밍/MSSQL

LinkedServer연결 후 - 분산 쿼리에서 Xml 데이터 형식을 사용할 수 없습니다.

MS-SQL LinkedServer 연결 후 데이터를 조회를 

SELECT TOP 100 intOrderNum FROM linkDB_Server_TO_JP.adprintNewDB.dbo.tblOrderItem

[실행]

 SELECT TOP 100 id FROM [linkDB_Server_XX].[DB].[dbo].[OrderItem]

[결과]

분산 쿼리에서 Xml 데이터 형식을 사용할 수 없습니다. 원격 개체 'linkDB_Server_XX.DB.dbo.OrderItem'에 xml 열이 있습니다.

라고 Error가 뜹니다. 

실제 해당 DB에는 xml형식의 데이터가 존재하고 있고 이를 어쩌나 구글링 한 결과! OPENQUERY를 사용을 하면서 이를 해결하였습니다.

[실행]

SELECT TOP 100 * FROM OPENQUERY([linkDB_Server_XX],'SELECT TOP 3 id FROM [DB].[dbo].[OrderItem]')

[결과]

1

2

3

또 컬럼중에 xml형식 데이터가 있을 때,

SELECT CAST(strWorkMemo AS XML) strWorkMemo
FROM OPENQUERY([linkDB_Server_XX], 'SELECT CAST(b.strWorkMemo AS NVARCHAR(max)) strWorkMemo FROM [Test].[dbo].tbl')

위와 같이 해주니까 해결.

[참고]

Linked Server를 이용한 DML 실행


Server.Data.base.owner.Object로 구성된 Fully Qualified Name을 사용하거나 OPENQUERY를 이용하는 방법이 있다. 


1. Fully Quanlified Name


- Object를 명시할 때 Server, Database, Owner, Object를 모두 기술하는 방식이다. Linked Server를 이용해서 쿼리하고자 할 경우에는 OPENQUERY를 사용하지 않고 Fully Qualified Name를 이용한다. 

- 한편 기술적으로 Fully Qualified Name는 OPENQUERY보다 사용하기 간편하나, 수행에 필요한 정보를 얻기 위해 메타데이터를 조회하는 양은 OPENQUERY가 적다. 

2. OPENQUERY

- SELECT문을 필요한 컬럼만 나열할 수 있다.

- WHERE절도 같이 기술해서 로컬로 가져오는 데이터량을 줄일 수 있다. 

※ 따라서 Fully Qualified Name을 사용하는 것보다 성능 면에서 유리하고 개선도 쉽다. 

참고사이트 : http://www.dator.co.kr/hjkim/91461