2017-12-07 12 views
2

아래 코드를 사용하여 XML을 SQL 테이블로 병합하려고합니다. 입력 데이터 테이블 (@incomingTable)에는 10k의 형식화되지 않은 XML이 포함되어 있으며 쿼리는 출력을 반환하기 위해 7 초가 걸립니다. 실행 계획을 확인했을 때 대부분의 시간은 "Table Vaued Functions (XPATH 필터가있는 XML Reader)"단계에 소비되었습니다. 내 생각 엔이 단계는 쿼리의 Value 메서드를 참조합니다.성능 문제 노드의 값 방법 및 교차 적용을 사용하여 SQL에서 XML을 병합

value() 메서드는 Transact-SQL CONVERT 연산자를 암시 적으로 사용하고 XQuery 식의 결과를 Transact-SQL 변환에서 지정한 해당 SQL 형식으로 변환하려고 시도합니다.

질문 : 데이터 유형 변환없이 요소/속성 값을 검색하는 다른 XML 방법이 있습니까? 어쨌든 데이터를 문자열로 원하기 때문입니다. 두 가지 접근 방식의 결과를 비교하는 데 도움이됩니다.

이 쿼리를 최적화하는 다른 방법이 있습니까?

select 
sqlXml.value('@ID', 'varchar(50)') as XMLFieldName, 
sqlXml.value('@TS', 'varchar(50)') as XMLTSValue, 
sqlXml.value('.','varchar(800)') as XMLFieldValue 
from @incomingTable 
cross apply playfieldvalues.nodes('/PlayAttributes/PlayFields/PlayField') as 
XMLData(sqlXml) 
+0

당신이'OPENXML'을 시도 했습니까? https://msdn.microsoft.com/en-us/library/ms186918(v=sql.110).aspx?f=255&MSPPError=-2147217396 – gofr1

+0

OPENXML은 행의 데이터를 원하는 열에 출력을 반환합니다. 그게 가능하니? – user1745679

+0

음 ... 귀하의 쿼리를 볼 - 그것은 3 열을 반환합니다. 제발, 정교하게. OPENXML도 똑같은 일을 할 수 있습니다. 거대한 XML을 가지고 있다면'nodes'보다 더 빨리 작동 할 것입니다. – gofr1

답변

0

봅니다 OPENXML를 사용 :

DECLARE @idoc int; 

EXEC sp_xml_preparedocument @idoc OUTPUT, @incomingTable; 

SELECT * 
FROM  OPENXML (@idoc, '/PlayAttributes/PlayFields/PlayField',1) 
      WITH (XMLFieldName varchar(50) '@ID', 
        XMLTSValue varchar(50) '@TS', 
        XMLFieldValue varchar(800) '.'); 

EXEC sp_xml_removedocument @idoc; 

OPENXML allows accessing XML data as if it were a relational recordset. It provides a tabular (rowset) view of in-memory representation of an XML document. Technically, OPENXML is a rowset provider similar to a table or a view; hence it can be used wherever a table or a view is used. For instance, you can use OPENXML with SELECT or SELECT INTO statements, to work on an XML document that is retained in memory.

Source

+0

이 예제를 시도하고 있습니다. 계속 게시 할 것입니다. 감사. – user1745679

+0

오류가 발생합니다. 메시지 257, 수준 16, 상태 31, 프로 시저 sp_xml_preparedocument, 줄 1 [배치 시작 줄 0] 데이터 형식 void 형식에서 ntext로 암시 적 변환이 허용되지 않습니다. 이 쿼리를 실행하려면 CONVERT 함수를 사용합니다. "" <운동장 ID ="Football.OffScore "TS의 = – user1745679

+0

내 XML 구조는 운동장 ID는 =>입니다" "> 17 <운동장 ID가 ="Football.DefScore "의 TS =" "> 7 <운동장 ID ="Football.AEB "의 TS =" ">은 <운동장 ID ="Football.YardsToGL "TS = ""> 2 <운동장 ID는 = "Football.FieldPosition"의 TS = ""> + <운동장 ID가 = "Football.Plays"의 TS = "2"> 1 <운동장 ID = "Football.ODK. ODK "TS =" "> FG,848,452, ' – user1745679