2015-01-08 3 views
2

이 포럼에 처음 게시 된 이후 처음으로 게시했습니다.SQL Server 2008R2 및 XML 문서 작성

다음 쿼리는 올바른 XML 문서를 @xTempXML 변수 (xml 유형)에 올바르게 할당합니다. 참고 : 문서의 길이 (VARCHAR (최대) = 711

select @xTempXML = (
     select 
      PrescriberFirstName  as "row/prescriber/name/first", 
      PrescriberLastName  as "row/prescriber/name/last", 
      PrescriberAddress1  as "row/prescriber/address/line1", 
      PrescriberAddress2  as "row/prescriber/address/line2", 
      PrescriberCity   as "row/prescriber/address/city", 
      PrescriberState   as "row/prescriber/address/state", 
      PrescriberZipCode  as "row/prescriber/address/zipcode", 
      PatientFirstName  as "row/patient/name/first", 
      PatientLastName   as "row/patient/name/last", 
      PatientMiddleName  as "row/patient/name/middle", 
      PatientAddress1   as "row/patient/address/line1", 
      PatientAddress2   as "row/patient/address/line2", 
      PatientCity    as "row/patient/address/city", 
      PatientState   as "row/patient/address/state", 
      PatientZipCode   as "row/patient/address/zipcode", 
      PatientFileID   as "row/patient/fileid", 
      PatientSSN    as "row/patient/ssn", 
      PatientDOB    as "row/patient/dob", 
      DrugDescription   as "row/medicationprescribed/description", 
      DrugStrength   as "row/medicationprescribed/strength", 
      DrugDEASchedule   as "row/medicationprescribed/deaschedule", 
      DrugQty     as "row/medicationprescribed/qty", 
      DrugDirections   as "row/medicationprescribed/directions", 
      DrugFormCode   as "row/medicationprescribed/form", 
      DrugDateWritten   as "row/medicationprescribed/writtendate", 
      DrugEffectiveDate  as "row/medicationprescribed/effectivedate", 
      DrugRefillQty   as "row/medicationprescribed/refill/qty", 
      DrugRefillQtyQualifier as "row/medicationprescribed/refill/qualifier", 
      DrugNote    as "row/medicationprescribed/note", 
      PharmacyStoreName  as "row/pharmacy/storename", 
      PharmacyIdentification as "row/pharmacy/identification", 
      PharmacyAddress1  as "row/pharmacy/address/line1", 
      PharmacyAddress2  as "row/pharmacy/address/line2", 
      PharmacyCity   as "row/pharmacy/address/city", 
      pharmacyState   as "row/pharmacy/address/state", 
      pharmacyZipCode   as "row/pharmacy/address/zipcode" 
     from 
      Rxarchive 
     where [email protected] 
      and CreatedDT between @RptParamStartDT and @RptParamStopDT 
      and CHARINDEX(',' + PrescriberFID + ',', ',' + @RptParamFID + ',') > 0 
     FOR XML PATH(''), ROOT('result'), TYPE 
     ) 

declare @sXMLVersion varchar(max) = '<?xml version="1.0" encoding="utf-8"?>' 
select len(@sXMLVersion + convert(varchar(max),@xTempXML)) 

주 변환 :. 올바른지 연결된 스트링 = 749의 길이

set @xFinalXML = convert(xml,(@sXMLVersion + CAST(@xTempXML as varchar(max)))) 

select LEN(convert(varchar(max),@xFinalXML)) 

참고 : 길이 이 변수는

select @xFinalXML 

변수가 여전히 유효한 XML 문서, 단지 어떤 버전 정보입니다! 다시 711입니다

내가 뭘 잘못 했니?

모든 도움을 주시면 대단히 감사하겠습니다.

답변

0

테스트 단계를 놓쳤습니다. 시도해보십시오.

SELECT CONVERT(XML, '<?xml version="1.0" encoding="utf-8"?>') 

빈 셀을 반환합니다.

XML 데이터 유형으로 시작할 이유가 없습니다. 당신은뿐만 아니라 FOR XML 절에서 , TYPE를 제거하고 단지 @sXMLVersion + @xTempXML

이 여기에 주목 일어나고있는 이유 연결할 수 있습니다? Limitations of the xml Data Type

XML 선언의 PI, 예를 들어, < XML 버전 = '를 1.0 '?>은 xml 데이터 형식 인스턴스에 XML 데이터를 저장할 때 보존되지 않습니다. 이는 의도적으로 설계된 동작입니다. 데이터가 xml 유형으로 변환 된 후 XML 선언 (<? xml ...?>) 및 해당 특성 (버전/인코딩/독립 실행 형)이 손실됩니다. XML 선언은 XML 구문 분석기에 대한 지시문으로 처리됩니다. XML 데이터는 내부적으로 ucs-2로 저장됩니다. XML 인스턴스의 다른 모든 PI는 보존됩니다. 제대로 XML 필드에서 데이터를 추출 처리하는 방법

은/변수는 여기에 주목 : XML Best Practices

SQL 서버 유니 코드 2005를 저장 XML 데이터 ("텍스트 인코딩"에서) (UTF-16). 서버에서 검색 한 XML 데이터는 UTF-16 인코딩으로 제공됩니다. 다른 인코딩을 원하면 검색된 데이터에서 필요한 변환을 수행해야합니다. 때로는 XML 데이터가 다른 인코딩에있을 수 있습니다. 그렇다면 데이터로드 중에주의를 기울여야합니다. 예 :

  • 텍스트 XML이 유니 코드 (UCS-2, UTF-16) 인 경우 XML 열, 변수 또는 매개 변수에 문제없이 할당 할 수 있습니다.
  • 인코딩이 유니 코드가 아니고 암시적일 경우 소스 코드 페이지로 인해 데이터베이스의 문자열 코드 페이지가로드하려는 코드 포인트와 같거나 호환 가능해야합니다. 필요한 경우 일괄 처리를 사용하십시오. 그러한 서버 코드 페이지가 없으면 올바른 인코딩을 사용하여 명시 적 XML 선언을 추가해야합니다.
  • 명시 적 인코딩을 사용하려면 코드 페이지와 상호 작용하지 않는 varbinary() 형식을 사용하거나 적절한 코드 페이지의 문자열 형식을 사용하십시오. 그런 다음 데이터를 XML C 럼, 변수 또는 매개 변수에 지정하십시오.

예 : 명시 적으로
당신은 VARCHAR (최대)로 저장된 XML 문서, vcdoc을 가지고 있다고 가정 코드화를 지정 명시 적 XML 선언이 없습니다. 다음 문은 XML 문서를 인코딩 "iso8859-1"과 함께 추가하고 XML 문서를 연결하고 결과를 varbinary (max)으로 캐스팅하여 바이트 표현이 유지되도록 한 다음 XML로 마지막 캐스트합니다. 이를 통해 XML 프로세서는 지정된 인코딩 "iso8859-1"에 따라 데이터를 구문 분석하고 문자열 값에 해당하는 UTF-16 표현을 생성 할 수 있습니다.

SELECT CAST(
    CAST (('<?xml version="1.0" encoding="iso8859-1"?>'+ vcdoc) AS VARBINARY (MAX)) 
    AS XML) 

다음 S.O. 질문에 관련이 있습니다

+0

멋진 캐치 # 1,하지만 그 빈 셀 것 왜하지 않는 유효한 것이 아니다 XML 선언문? 몸을 잃어 버렸어! # 2의 경우 최종 결과물은 XML – Kurt

+1

이어야합니다. 필자가 언급 한 동일한 게시물에서이 파일을 제거하고 어떻게 든 앞으로 나아가 계속 연결하고 변환하여 잃어 버렸습니다. Duhh !! 우수한 반응에 감사드립니다. – Kurt

관련 문제