0

XMLドキュメントをSQL Serverのデータテーブルに細断処理しようとしているのを手伝ってくれる人はいますか? XML SCHEMA COLLECTION を使用して xml ドキュメントを検証しています。以下は私のXMLスキーマのコピーです

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" 
 targetNamespace="http://www.healthcenter.com" xmlns="http://www.healthcenter.com" 
xmlns:sql="urn:schemas-microsoft-com:mapping-schema" elementFormDefault="qualified"  
version="2.0.1.1">

  <xs:element name="HealthCenter">
    <xs:complexType>
      <xs:sequence>
       <xs:element name="Patients" type="PatientDetails"/>
    <xs:element name="Doctors"  type="DoctorsDetails"/>
    <xs:element name="Ailment"  type="AilementDetails"/> 
  </xs:sequence> 
</xs:complexType>
</xs:element>
<xs:complexType name="PatientDetails">
<xs:sequence>
  <xs:element name="PatientID" type="xs:integer"/>
  <xs:element name="FirstName" type="xs:string"/>
  <xs:element name="LastName" type="xs:string"/>
  <xs:element name="Age" type="xs:string"/>
  <xs:element name="AilementID" type="xs:integer"/>
  <xs:element name="DoctorID" type="xs:integer"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="DoctorsDetails">
<xs:sequence>
  <xs:element name="DoctorID" type="xs:integer"/>
  <xs:element name="DoctorName" type="xs:string"/>
  <xs:element name="DoctorType" type="DoctorCategory"/>
</xs:sequence>
</xs:complexType> 
 <xs:complexType name ="AilementDetails">
<xs:sequence>
  <xs:element name ="AilementID" type="xs:integer"/>
  <xs:element name ="AilementName" type="xs:string"/>
  <xs:element name ="AilementCode" type="AilmentCodeTypes"/>  
 </xs:sequence>
</xs:complexType>
      <xs:simpleType name="DoctorCategory">
   <xs:restriction base="xs:string">
   <xs:enumeration value="Dentist"/>
   <xs:enumeration value="PhysioTherapist"/>
   <xs:enumeration value="Gynocologist"/>
   <xs:enumeration value="GeneralPrctitioner"/>
 </xs:restriction>
</xs:simpleType>
    <xs:simpleType name="AilmentCodeTypes">
   <xs:restriction base="xs:string">
  <xs:enumeration value="SDE"/>
  <xs:enumeration value="SIE"/>
  <xs:enumeration value="SUE"/>
  <xs:enumeration value="NRE"/>
 </xs:restriction>
</xs:simpleType>
</xs:schema>' 

--XML Validation

DECLARE @XMLDATA XML(dbo.DoctorPatients)
DECLARE @IDOC INT
SET @XMLDATA = '<HealthCenter xmlns="http://www.healthcenter.com">
<Patients>
    <PatientID>1</PatientID>
    <FirstName>Micheal</FirstName>
    <LastName>Huie</LastName>
    <Age>28</Age>
    <AilementID>1</AilementID>
    <DoctorID>1</DoctorID>
</Patients>
<Doctors>
    <DoctorID>1</DoctorID>
    <DoctorName>Sheldon Huie</DoctorName>
    <DoctorType>Dentist</DoctorType>
</Doctors>
<Ailment>
    <AilementID>1</AilementID>
    <AilementName>Dementia</AilementName>
    <AilementCode>SDE</AilementCode>
</Ailment>  
</HealthCenter>

sp_xml_preparedocumentとを使用してデータをテーブルに細断処理す​​る方法は次のとおりですOPENXML

    EXEC sp_xml_preparedocument @IDOC OUTPUT,@XMLDATA
    SELECT * 
    FROM
    OPENXML(@IDOC,'/HealthCenter/Patients',2)
    WITH(PatientID INT,
         FirstName VARCHAR(50),
         LastName VARCHAR(50),
         Age VARCHAR(3),
         AilementID INT,
         DoctorID INT
         )
      EXEC sp_xml_removedocument @IDOC 

上記により、SQL Server でこのエラー メッセージが生成されます

メッセージ 6628、レベル 16、状態 1、プロシージャ sp_xml_preparedocument、行 1
sp_xml_preparedocument は、型指定されていない XML のみを処理できます。入力値を XML または文字列型にキャストします。
メッセージ 8179、レベル 16、状態 5、行 26
ハンドル 0 の準備済みステートメントが見つかりませんでした
。 メッセージ 6607、レベル 16、状態 3、プロシージャ sp_xml_removedocument、行 1
sp_xml_removedocument: パラメータ番号 1 に指定された値が無効です。

私はすべてを正しく行ったと思いますが、なぜこのようなエラーメッセージが表示されるのかを誰かが見つけてくれれば、それは素晴らしいことです. 最初にデータを表示したかっただけで、まだテーブルにデータを挿入しようとしていないことに注意してください。

コードブロック内のテキストを取得するために再配置しなければならなかった私のフォーマットを許してください

4

1 に答える 1

1

私は、面倒でメモリを大量に消費するコードではなく、SQL Server 2005 以降のネイティブOpenXMLXQuery サポートを使用しようとします。

これを試してください - これはあなたの XML スキーマ コレクションで動作しますか?

;WITH XMLNAMESPACES(DEFAULT 'http://www.healthcenter.com')
SELECT
    PatientID = Patients.value('(PatientID)[1]', 'int') ,
    PatientFirstName = Patients.value('(FirstName)[1]', 'varchar(50)') ,
    PatientLastName = Patients.value('(LastName)[1]', 'varchar(50)') ,
    PatientAge = Patients.value('(Age)[1]', 'int') ,
    PatientAilmentID = Patients.value('(AilementID)[1]', 'int') ,
    PatientDoctorID = Patients.value('(DoctorID)[1]', 'int') 
FROM
    @XmlData.nodes('/HealthCenter/Patients') AS XTbl(Patients)
于 2013-05-19T11:04:32.217 に答える