任何人都可以帮助我尝试将XML文档碎化为SQL Server中的数据表。我正在使用XML SCHEMA COLLECTION来验证xml文档。下面是我的XML Schema的副本
<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或字符串类型 Msg 8179,Level 16,State 5,Line 26
找不到句柄0的准备好的声明。
消息6607,级别16,状态3,过程sp_xml_removedocument,行1 sp_xml_removedocument:为参数编号1提供的值无效。
我认为我已经做好了一切,但是如果有人能够发现为什么我会收到这样的错误消息会很棒。注意我还没有尝试将数据插入表中,只是想先显示数据。
原谅我的格式化我必须重新排列才能在代码块中获取文本
答案 0 :(得分:1)
我会尝试在SQL Server 2005及更新版本中使用原生 XQuery支持,而不是使用笨重且内存密集的OpenXML
代码。
试试这个 - 这是否适用于您的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)