2017-11-08 9 views
1
나는 같은 구조를 가진 여러 XML 파일, 나는 SQL 서버 다음 명령을 2017로 가져온 한

:SQL 서버로 가져온 여러 XMLS의 특정 필드를 검색

DDL :

CREATE DATABASE xmlFiles 
GO 

USE xmlFiles 
CREATE TABLE tblXMLFiles (IntCol int, XmlData xml); 
GO 

DML :

USE xmlFiles 
INSERT INTO [dbo].[tblXMLFiles](XmlData) SELECT * FROM OPENROWSET(BULK 'C:\xmls\1.xml', SINGLE_BLOB) AS x; 
INSERT INTO [dbo].[tblXMLFiles](XmlData) SELECT * FROM OPENROWSET(BULK 'C:\xmls\2.xml', SINGLE_BLOB) AS x; 
… 
INSERT INTO [dbo].[tblXMLFiles](XmlData) SELECT * FROM OPENROWSET(BULK 'C:\xmls\N.xml', SINGLE_BLOB) AS x; 

는 지금은 데이터를 조회 할 : 쿼리가 작동

USE xmlFiles 
GO 

DECLARE @XML AS XML, @hDoc AS INT, @SQL NVARCHAR (MAX) 

SELECT @XML = XmLData FROM tblXMLFiles 

EXEC sp_xml_preparedocument @hDoc OUTPUT, @XML 

SELECT Surname , GivenNames 
FROM OPENXML(@hDoc, 'article/ref-list/ref/mixed-citation') 
WITH 
(
    Surname [varchar](100) 'string-name/surname', 
    GivenNames [varchar](100) 'string-name/given-names' 
) 

EXEC sp_xml_removedocument @hDoc 
GO 

을하지만, 문제는 데이터 소스 테이블의 한 행이있는 경우에만이 데이터를 반환한다는 것입니다 - tblXMLFiles가. 둘 이상의 행을 추가하면 빈 결과 집합이 나옵니다. 중요

는 :
내가 외부 SELECT 절 (SELECT @XML = XmLData…)를 TOP 문에 추가하는 경우 상황은 변화하고, 다음은 TOP 값에 따라, 특정 행 번호의 조회 된 데이터를 반환합니다.

질문 :

가 어떻게 테이블에 한 줄이없는 경우에만 데이터를 검색하지만, 많은 행 수 있습니까?

답변

2

해당 SP를 준비하고 문서를 제거하려면 더 이상 사용하지 않아야합니다. 적절한 methods the XML data type provides을 사용하십시오. 당신의 XML 예제없이

는이 솔루션을 제공하는 것은 매우 어렵지만, 내 마법의 수정 구슬은 이런 식으로 뭔가있을 것을 저에게 말한다 :

SELECT f.IntCol 
     ,mc.value('(string-name/surname)[1]','nvarchar(max)') AS Surname 
     ,mc.value('(string-name/given-names)[1]','nvarchar(max)') AS GivenNames 
FROM dbo.tblXMLFiles AS f 
OUTER APPLY f.XmlData.nodes('article/ref-list/ref/mixed-citation') AS A(mc) 
+0

감사, 마법의 수정 구슬이 알고있는 방법 XML을 파헤 치자! 링크를위한 특별한 감사. –