使用SQL Server 2008中在运行时指定的XSD验证XML?

Tim*_*m S 5 xml t-sql xsd sql-server-2008

SQL Server 2008允许我们通过定义类型化的XML列/变量来对照现有XML架构集合来验证XML: DECLARE @TypedXml XML(MyXmlSchemaCollection)

但是,据我所知,在定义列/变量时必须知道XML Schema Collection。

有没有一种方法可以使用运行时指定的XML模式来验证XML ?

例如:

DECLARE @Xml XML
SET @Xml = 
N'<person>
    <firstname>Ming</firstname>
    <lastname>The Merciless</lastname>
</person>'

DECLARE @Xsd XML
SET @Xsd =
N'<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
 <xs:element name="person">
  <xs:complexType>
    <xs:sequence>
      <xs:element name="firstname" type="xs:string"/>
      <xs:element name="lastname" type="xs:string"/>
      <xs:element name="dateofbirth" type="xs:date"/>
    </xs:sequence>
  </xs:complexType>
 </xs:element>
</xs:schema>'

DECLARE @Valid BIT
SET @Valid = (SELECT dbo.f_ValidateXmlAgainstXsd(@Xml, @Xsd)) -- With a user-defined function?
EXEC @Valid = s_ValidateXmlAgainstXsd @Xml, @Xsd -- With a stored procedure?
Run Code Online (Sandbox Code Playgroud)

Pet*_*dea 2

对于您的需求,我可能会探索 CLR 集成:使用存储过程用户定义的函数;您应该首先检查您的环境中是否允许 CLR 集成。

在这里发帖实在是太多了;但是,使用 .NET 验证 XML 文档的代码很常见;只要 SQL 2008 存在,我添加到 SQL Server 在线书籍的链接就会存在...

一般来说,我认为要实现不受 SQL Server 支持 XSD 方式限制的验证,应该依赖 CLR 集成。无论如何,SQL Server 上 XSD 集合的限制(如此所述)可能会让许多人朝这个方向转变。在大容量环境中需要解决一些问题,在我看来,编译的 XSD 的缓存是最重要的一个。另一个是 XSD 的复杂性,以及 XSD 的来源和引用方式(包括/导入/重新定义支持)。尝试自己实现这些方面将使您肯定了解为什么 SQL Server 不支持 xsd:include...