sp_xml_preparedocument(Transact-SQL)
입력으로 제공되는 XML 텍스트를 읽고 MSXML 파서(Msxmlsql.dll)를 사용하여 이 텍스트의 구문을 분석한 다음 구문 분석된 문서를 사용할 수 있는 상태로 제공합니다. 이 구문 분석된 문서는 요소, 특성, 텍스트 및 주석 등 XML 문서의 다양한 노드를 트리로 나타낸 것입니다.
sp_xml_preparedocument는 XML 문서의 새로 생성된 내부 표현에 액세스하는 데 사용할 수 있는 핸들을 반환합니다. 이 핸들은 sp_xml_removedocument를 실행하여 무효화한 경우를 제외하고는 세션이 유지되는 동안 유효합니다.
[!참고]
구문 분석된 문서는 SQL Server의 내부 캐시에 저장됩니다. MSXML 파서는 SQL Server에서 사용할 수 있는 총 메모리의 8분의 1을 사용합니다. 메모리 부족을 방지하려면 sp_xml_removedocument를 실행하여 메모리를 확보합니다.
[!참고]
이전 버전과의 호환성을 위해 sp_xml_preparedocument는 특성에서 CR(char(13)) 및 LF(char(10)) 문자가 수정된 경우에도 이러한 문자를 축소합니다.
[!참고]
sp_xml_preparedocument에 의해 호출된 XML 파서는 내부 DTD 및 엔터티 선언을 구문 분석할 수 있습니다. 악의적으로 생성된 DTD 및 엔터티 선언을 사용하여 서비스 거부 공격을 수행할 수 있으므로 사용자들은 신뢰할 수 없는 출처의 XML 문서를 sp_xml_preparedocument로 직접 전달하지 않도록 해야 합니다.
재귀 엔터티 확장 공격을 완화하기 위해 sp_xml_preparedocument는 문서의 최상위 수준의 단일 엔터티에서 확장할 수 있는 엔터티 수를 최대 10,000개로 제한합니다. 문자 또는 숫자 엔터티에는 이 제한이 적용되지 않습니다. 이 제한은 많은 엔터티 참조가 포함된 문서의 저장을 허용하지만 하나의 엔터티가 10,000개 확장보다 긴 체인에서 재귀적으로 확장되는 것을 방지합니다.
[!참고]
sp_xml_preparedocument는 한 번에 열 수 있는 요소 수를 최대 256개로 제한합니다.
구문
sp_xml_preparedocument
hdoc
OUTPUT
[ , xmltext ]
[ , xpath_namespaces ]
인수
hdoc
새로 생성된 문서의 핸들입니다. hdoc은 정수입니다.[ xmltext ]
원본 XML 문서입니다. MSXML 파서는 이 XML 문서의 구문을 분석합니다. xmltext는 char, nchar, varchar, nvarchar, text, ntext 또는 xml 등의 텍스트 매개 변수입니다. 기본값은 NULL이며 이 경우에는 빈 XML 문서의 내부 표현이 생성됩니다.[!참고]
sp_xml_preparedocument는 텍스트 또는 형식화되지 않은 XML만 처리할 수 있습니다. 입력으로 사용할 항목의 값이 형식화된 XML인 경우에는 먼저 형식화되지 않은 새로운 XML 항목 또는 문자열로 캐스팅한 다음 해당 값을 입력으로 전달합니다. 자세한 내용은 형식화된 XML과 형식화되지 않은 XML을 참조하십시오.
[ xpath_namespaces ]
OPENXML의 행과 열 XPath 식에 사용되는 네임스페이스 선언을 지정합니다. xpath_namespaces는 char, nchar, varchar, nvarchar, text, ntext 또는 xml 등의 텍스트 매개 변수입니다.기본값은 **<root xmlns:mp="urn:schemas-microsoft-com:xml-metaprop">**입니다. xpath_namespaces는 올바른 형식의 XML 문서로 OPENXML의 XPath 식에서 사용되는 접두사에 네임스페이스 URI를 제공합니다. xpath_namespaces는 urn:schemas-microsoft-com:xml-metaprop 네임스페이스를 참조하는 데 사용되어야 하는 접두사를 선언하며 이는 구문 분석된 XML 요소에 대한 메타데이터를 제공합니다. 이 기술을 사용하여 메타 속성 네임스페이스의 네임스페이스 접두사를 다시 정의할 수 있지만 이 네임스페이스는 손실되지 않습니다. xpath_namespaces에 이러한 선언이 없는 경우에도 접두사 mp는 urn:schemas-microsoft-com:xml-metaprop에 대해 계속 유효합니다.
반환 코드 값
0(성공) 또는 >0(실패)
사용 권한
public 역할의 멤버 자격이 필요합니다.
예
1. 올바른 형식의 XML 문서를 위한 내부 표현 준비
다음 예에서는 입력으로 제공된 XML 문서의 새로 생성된 내부 표현에 대한 핸들을 반환합니다. sp_xml_preparedocument 호출에서 기본 네임스페이스 접두사 매핑이 사용됩니다.
DECLARE @hdoc int
DECLARE @doc varchar(1000)
SET @doc ='
<ROOT>
<Customer CustomerID="VINET" ContactName="Paul Henriot">
<Order CustomerID="VINET" EmployeeID="5" OrderDate="1996-07-04T00:00:00">
<OrderDetail OrderID="10248" ProductID="11" Quantity="12"/>
<OrderDetail OrderID="10248" ProductID="42" Quantity="10"/>
</Order>
</Customer>
<Customer CustomerID="LILAS" ContactName="Carlos Gonzlez">
<Order CustomerID="LILAS" EmployeeID="3" OrderDate="1996-08-16T00:00:00">
<OrderDetail OrderID="10283" ProductID="72" Quantity="3"/>
</Order>
</Customer>
</ROOT>'
--Create an internal representation of the XML document.
EXEC sp_xml_preparedocument @hdoc OUTPUT, @doc
-- Remove the internal representation.
exec sp_xml_removedocument @hdoc
2. DTD가 있는 올바른 형식의 XML 문서를 위한 내부 표현 준비
다음 예에서는 입력으로 제공된 XML 문서의 새로 생성된 내부 표현에 대한 핸들을 반환합니다. 저장 프로시저는 문서에 포함된 DTD에 대해 로드된 문서의 유효성을 검사합니다. sp_xml_preparedocument 호출에서 기본 네임스페이스 접두사 매핑이 사용됩니다.
DECLARE @hdoc int
DECLARE @doc varchar(2000)
SET @doc = '
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE root
[<!ELEMENT root (Customers)*>
<!ELEMENT Customers EMPTY>
<!ATTLIST Customers CustomerID CDATA #IMPLIED ContactName CDATA #IMPLIED>]>
<root>
<Customers CustomerID="ALFKI" ContactName="Maria Anders"/>
</root>'
EXEC sp_xml_preparedocument @hdoc OUTPUT, @doc
3. 네임스페이스 URI 지정
다음 예에서는 입력으로 제공된 XML 문서의 새로 생성된 내부 표현에 대한 핸들을 반환합니다. sp_xml_preparedocument 호출은 메타 속성 네임스페이스 매핑에 대한 mp 접두사를 보존하고 xyz 매핑 접두사를 urn:MyNamespace 네임스페이스에 추가합니다.
DECLARE @hdoc int
DECLARE @doc varchar(1000)
SET @doc ='
<ROOT>
<Customer CustomerID="VINET" ContactName="Paul Henriot">
<Order CustomerID="VINET" EmployeeID="5"
OrderDate="1996-07-04T00:00:00">
<OrderDetail OrderID="10248" ProductID="11" Quantity="12"/>
<OrderDetail OrderID="10248" ProductID="42" Quantity="10"/>
</Order>
</Customer>
<Customer CustomerID="LILAS" ContactName="Carlos Gonzlez">
<Order CustomerID="LILAS" EmployeeID="3"
OrderDate="1996-08-16T00:00:00">
<OrderDetail OrderID="10283" ProductID="72" Quantity="3"/>
</Order>
</Customer>
</ROOT>'
--Create an internal representation of the XML document.
EXEC sp_xml_preparedocument @hdoc OUTPUT, @doc, '<ROOT xmlns:xyz="urn:MyNamespace"/>'