【问题标题】:Validate XML using XSD specified at runtime in SQL Server 2008?使用 SQL Server 2008 运行时指定的 XSD 验证 XML?
【发布时间】:2012-05-21 21:48:17
【问题描述】:

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

但是,据我所知,在我们定义列/变量时必须知道 XML 模式集合。

有没有办法使用在运行时指定的 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?

【问题讨论】:

    标签: xml sql-server-2008 tsql xsd


    【解决方案1】:

    对于您的要求,我可能会探索 CLR 集成:使用 stored proceduresuser defined functions;您应该首先检查在您的环境中是否允许 CLR 集成。

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

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

    【讨论】:

    • 感谢 Petru 非常全面的回答。我怀疑 CLR 是要走的路,但只是想检查一下我没有忽略在本机 SQL Server 代码中执行此操作的方法。
    【解决方案2】:

    如果您要针对存储在数据库中的一组预定义 XSD 进行验证,则可以在存储过程中使用动态 SQL 来进行验证。

    如果您想针对任何 XSD 进行验证,最好使用 CLR,就像 Petru 的回答一样。

    以下脚本可以工作。如果输入 XML 无效,它会引发异常。如果您希望验证仅返回结果而不是引发异常,则可以使用 try/catch 子句。

    编辑: 您不能在函数中使用动态 SQL,但可以将此脚本包装在存储过程中。

        DECLARE @result int
    
        DECLARE @XsdValidationSQL nvarchar(max) = 
            'DECLARE @xml xml(' + @xsdSchema + '.' + @xsdName + ') = ''' + CONVERT(nvarchar(max), @xml) + ''''
    
        EXEC @result = sp_executesql @XsdValidationSQL
    
        RETURN @result
    

    【讨论】:

    • 你能详细解释一下你是怎么做的吗,因为结果是:Msg 557, Level 16, State 2, Line 6 Only functions and some extended stored procedures can be executed from within a function.
    • @new2ios 你说得对,我在将代码包装在一个函数中后没有实际测试它就对其进行了测试。我不知道您不允许从函数内执行动态 SQL。对不起。
    猜你喜欢
    • 2011-12-21
    • 2012-04-13
    • 2014-07-13
    • 1970-01-01
    • 1970-01-01
    • 2014-03-27
    • 2016-10-18
    相关资源
    最近更新 更多