2013-05-09 3 views
0

잘못된 문자가 포함 된 요소를 추가하는 데 문제가 있습니다. 나는 다음 SQL을 가지고있다sql xml의 느낌표

SELECT 
'en-GB' AS '@xml:lang', 
'[email protected]' AS '@payloadID', 
'2012-02-17T16:46:11' AS '@timestamp', 
'1.2.014' AS '@version', 
    (SELECT 
    (SELECT /* FROM */ 
     (SELECT 'TecSolExchangeID' AS 'Credential/@domain', 33333 AS 'Credential/Identity' 
     FOR XML PATH(''), TYPE), 
     (SELECT 'name' AS 'Credential/@domain', 'Test Limited' AS 'Credential/Identity' 
     FOR XML PATH(''), TYPE) 
     FOR XML PATH('From'), TYPE), 
    (SELECT /* TO */ 
     (SELECT 'TecSolExchangeID' AS 'Credential/@domain', 66666 AS 'Credential/Identity' 
     FOR XML PATH(''), TYPE), 
     (SELECT 'name' AS 'Credential/@domain', 'Test Company' AS 'Credential/Identity' 
     FOR XML PATH(''), TYPE) 
     FOR XML PATH('To'), TYPE), 
    (SELECT /* SENDER */ 
     (SELECT 'TecSolExchangeID' AS 'Credential/@domain', 13041 AS 'Credential/Identity', '' AS 'Credential/SharedSecret' 
     FOR XML PATH(''), TYPE), ' cXML Link v1.3.0' AS 'UserAgent' 
     FOR XML PATH('Sender'), TYPE) 
    FROM TEST2.PORDER 
    WHERE POHNUM_0 = '2011302POH00000002' 
    FOR XML PATH('Header'),TYPE) 
    , (SELECT 'production' AS '@deploymentMode', 
    (SELECT 
        (SELECT /* ShipNoticeHeader */ 
       (SELECT '' 
       FOR XML PATH(''), 
        TYPE) 
      FOR XML PATH('ShipNoticeHeader'), 
       TYPE), 
      (SELECT '' AS '@domain', 
       '' as 'CarrierIdentfier', 
         ''AS 'ShipmentIdentifier' 
      FOR XML PATH('ShipControl'), 
       TYPE), 
           (SELECT /* Ship Notice Portion */ 
        (SELECT '1;29117/42' AS 'DocumentReference/@PayLoadID', 
          '' AS 'DocumentReference' 
        FOR XML PATH('OrderReference'), 
         TYPE), 
              (SELECT '4' AS '@Quantity', 
              '1' AS '@LineNo', 
          'Box 4' AS 'UnitOfMeasure' 
        FOR XML PATH('ShipNoticeItem'), 
         TYPE) 
        FOR XML PATH('ShipNoticePortion'), 
         TYPE) 

     FROM TEST2.PORDER 
     WHERE POHNUM_0 = '2011302POH00000002' 
     FOR XML PATH('ShipNoticeRequest'), 
      TYPE) 
    FROM TEST2.PORDER 
    WHERE POHNUM_0 = '2011302POH00000002' 
    FOR XML PATH('Request'), 
     TYPE) 
FROM TEST2.PORDER 
WHERE POHNUM_0 = '2011302POH00000002' 
    FOR XML PATH('?XML') 

나는 알 수 있듯이 루트 필드에는 물음표가있다. 이 오류와 함께 실패합니다. '? XML'에 FOR XML에 필요한 잘못된 XML 식별자가 포함되어 있습니다. '?'(0x003F)는 오류가 발생한 첫 번째 문자입니다. '

내 질문에 잘못된 문자가 들어있는 요소를 만들 수 있어야합니다. 예를 들어 "<! DOCTYPE >"이 될 메시지를 둘러싼 다른 요소가 필요합니다. 이 필드를 제외하고 동일한 시나리오에는 느낌표가 있습니다.

먼저 가능하나요, 그렇다면 누구나 제가 도와 드릴 수 있습니다. 당신이 FOR XMLNVARCHAR 조작의 조합을 사용하여이를 달성 할 수 있지만 사전

+0

아마도 데이터베이스 레이어가 실제와 같은 본격적인 문서를 구성하는 데 가장 현명한 장소가 아니라고 생각해 본 적이 있습니까? (실제로 XML이 아니므로 XML 기능이 여러분과 싸우고 있습니다) –

답변

0

에서

덕분에 당신은 For XML의 일환으로이 작업을 수행 할 수 없습니다. 그래서 만약 당신이 (당신이 현실 생성 HTML에 있기 때문에) 문서 타입을 추가하려면

, 당신은 이런 식으로 작업을 수행 할 수 있습니다

select '<!DOCTYPE html>' 
+ cast(
(
    -- XML bit here 
    -- Replace this with your XML query. 

    select 
     A 
    from (
     select 'a1' as A 
     union select 'a2' 
     ) a 
     for xml path(''), root('Z'), type 
) 
as nvarchar(Max)) 

그러나 결과는 하지는 SQL에 적합한 XML 될 것입니다 점에 유의 다시 가져올 서버.

토론

XML 및 HTML (SGML의있는 유형 모두) 관련,하지만 동일하지 않습니다. HTML에는 XML에는없는 기능이 있으며 XML에는 HTML에는없는 기능이 있습니다.

HTML의 하위 집합 인 XML 하위 집합을 작성할 수도 있습니다.이 하위 집합은 종종 유용하지만 둘 중 어느 것도 다른 집합의 하위 집합이 아닙니다.