sp_xml_preparedocument(Transact-SQL)
적용 대상: SQL Server Azure SQL Database
입력으로 제공된 XML 텍스트를 읽고, MSXML 파서(msxmlsql.dll
)를 사용하여 텍스트를 구문 분석하고, 구문 분석된 문서를 사용할 준비가 된 상태로 제공합니다. 구문 분석된 이 문서는 XML 문서의 다양한 노드(요소, 특성, 텍스트, 메모 등)의 트리 표현입니다.
sp_xml_preparedocument
는 XML 문서의 새로 만든 내부 표현에 액세스하는 데 사용할 수 있는 핸들을 반환합니다. 이 핸들은 세션 중에 유효하거나 실행을 통해 핸들이 무효화될 때까지 유효합니다 sp_xml_removedocument
.
구문 분석된 문서는 SQL Server의 내부 캐시에 저장됩니다. MSXML 파서는 SQL Server에 사용할 수 있는 총 메모리의 1/8을 사용할 수 있습니다. 메모리가 부족하지 않도록 하려면 문서를 더 이상 필요하지 않은 즉시 실행 sp_xml_removedocument
하여 메모리를 확보합니다. 대부분의 경우 nodes() 메서드가 더 나은 대안이 될 수 있으며 과도한 메모리 사용을 방지하는 데 도움이 될 수 있습니다.
이전 버전과의 호환성을 sp_xml_preparedocument
위해 이러한 문자가 엔터티화된 경우에도 특성의 CR(char(13)
) 및 LF(char(10)
) 문자를 축소합니다.
참고 항목
호출된 sp_xml_preparedocument
XML 파서는 내부 DTD 및 엔터티 선언을 구문 분석할 수 있습니다. 악의적으로 생성된 DTD 및 엔터티 선언을 사용하여 서비스 거부 공격을 수행할 수 있으므로 사용자가 신뢰할 수 없는 원본 sp_xml_preparedocument
에서 XML 문서를 직접 전달하지 않는 것이 좋습니다.
재귀 엔터티 확장 공격을 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는 문자, nchar, varchar, nvarchar, text, ntext 또는 xml이라는 텍스트 매개 변수입니다. 기본값은 NULL
빈 XML 문서의 내부 표현이 만들어지는 경우입니다.
참고 항목
sp_xml_preparedocument
는 텍스트 또는 형식화되지 않은 XML만 처리할 수 있습니다. 입력으로 사용할 인스턴스 값이 이미 XML 형식인 경우 먼저 형식화되지 않은 새 XML 인스턴스 또는 문자열로 캐스팅한 다음 해당 값을 입력으로 전달합니다. 자세한 내용은 형식화된 XML과 형식화되지 않은 XML 비교를 참조하세요.
[ xpath_namespaces ]
OPENXML에서 행 및 열 XPath 식에 사용되는 네임스페이스 선언을 지정합니다. xpath_namespaces 문자, 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 역할의 멤버 자격이 필요합니다.
예제
A. 올바른 형식의 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;
B. 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;
C. 네임스페이스 URI 지정
다음 예에서는 입력으로 제공되는 XML 문서의 새로 만든 내부 표현에 대한 핸들을 반환합니다. 메타 속성 네임스페이스 매핑에 대한 접두사를 유지하고 mp
네임urn:MyNamespace
스페이스에 매핑 접두사를 추가하는 xyz
호출 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, '<ROOT xmlns:xyz="urn:MyNamespace"/>';