2011-11-26 3 views
4

XML을 구문 분석 할 때 SQL Server가 \r자를 제거하는 것처럼 보입니다. 그래서 내 저장 프로 시저가 절약을 위해 XML 값을받을 때, 모든 줄 바꿈은 \n 대신 \r\n.OPENXML을 사용하여 캐리지 리턴 기호가 제거되었습니다.

\r 문자를 제거하지 않도록 내가 SQL 서버를 강제 할 수있는 방법이 있나요로 표시됩니다? 아래 샘플에서 Node1 값은 \r 기호를 포함하지 않습니다.


    DECLARE @hDoc int 
    DECLARE @Xml nvarchar(MAX) 
    SET @Xml = N'<Root><Node1><![CDATA[' + nchar(13) + nchar(10) + N'Some ' + nchar(13) + nchar(10) + N' Value]]></Node1></Root>' 
    EXEC sp_xml_preparedocument @hDoc OUTPUT, @Xml 

    SELECT 
     Node1 
     ,convert(varbinary(max),Node1) -- Contains 0A00 in the start instead of 0D0A, 
     ,charindex(nchar(13),Node1) 
    FROM 
     OPENXML(@hDoc, N'/Root', 2) WITH (Node1 NVARCHAR(MAX)) 

    EXEC sp_xml_removedocument @hDoc 

출력 :
enter image description here

@PJB 대신 XQuery nodes를 사용하도록 제안. 그러나 이것은 도움이되지 않습니다. 나는 아래의 쿼리를 실행하고 동일한 결과를 얻었다.


    DECLARE @xml xml 
    SET @xml = convert(xml, N'<Root><Node1><![CDATA[' + nchar(13) + nchar(10) + N'Some ' + nchar(13) + nchar(10) + N' Value]]></Node1></Root>') 

    declare @Node1 nvarchar(30) 
    select @Node1 = node.value('.', 'nvarchar(30)') 
    from @xml.nodes('/Root/Node1') as doc(node) 

    SELECT 
     @Node1 
     ,convert(varbinary(max),@Node1) -- Contains 0A00 in the start instead of 0D0A, 
     ,charindex(nchar(13),@Node1) 

답변

3

캐리지 리턴 기호는이 End-of-Line Handling에 XML 사양에 따라 올바른 동작입니다 XML

에서 제거됩니다.

가 #xD #xA 두 개의 문자 시퀀스를 변환하여, 분석하기 전에 모든 라인 입력에 (문서 실체를 포함) 외부의 분석 엔티티에서 바꿈 정규화 것처럼 XML 프로세서가 동작해야 임의의 #xA 뒤에 #xA가 오지 않는 모든 #xD.

캐리지 리턴을 되돌리려면 replace을 사용해보세요.

select @Node1 = replace(node.value('.', 'nvarchar(30)'), nchar(10), nchar(13)+nchar(10)) 
from @xml.nodes('/Root/Node1') as doc(node) 
+0

감사합니다. Mikael, 좋은 설명. –