1

我有一个 XML 列的模式集合关联。我想将子元素添加到架构集合中的现有父元素。

我试图在不删除模式关联的情况下实现这一点,因为具有该列的表包含数据并且在删除关联时会受到限制。

架构看起来像这样

create xml schema collection dbo.Book
as
N'<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <xsd:element name="Books">
    <xsd:complexType>
      <xsd:sequence>
        <xsd:element type="xsd:string" name="AuthorFirstName" maxOccurs="unbounded" minOccurs="0"/>
      </xsd:sequence>
    </xsd:complexType>
  </xsd:element>
</xsd:schema>';
go

现在我想在父元素(书籍)中再添加一个子元素,就像这样

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <xsd:element name="Books">
    <xsd:complexType>
      <xsd:sequence>
        <xsd:element type="xsd:string" name="AuthorFirstName" maxOccurs="unbounded" minOccurs="0"/>
        <xsd:element type="xsd:string" name="AuthorLastName" maxOccurs="unbounded" minOccurs="0"/>
      </xsd:sequence>
    </xsd:complexType>
  </xsd:element>
</xsd:schema>

有什么解决方案可以在不删除 XML 模式集合的情况下对其进行更改?

4

1 回答 1

1

SQL Server 在这里限制了你一点。它不允许您修改现有 XML 模式集合中现有名称空间中的现有元素。但是,如果您的模式名称空间设计为可扩展的,您可以向现有 XML 模式集合添加更多名称空间。

考虑以下内容,它定义了一个可扩展的“Books V1”命名空间,然后通过“Books V2”命名空间添加了一个新元素......

create xml schema collection dbo.Book as
N'<xs:schema targetNamespace="http://tempuri.org/Books-v1"
  xmlns="http://tempuri.org/Books-v1"
  xmlns:xs="http://www.w3.org/2001/XMLSchema"
  elementFormDefault="qualified">
  <xs:element name="Books">
    <xs:complexType>
      <xs:sequence>
        <xs:element type="xs:string" name="AuthorFirstName" minOccurs="0" maxOccurs="unbounded"/>
        <xs:any namespace="##other" minOccurs="0" processContents="lax"/>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>';
go
alter xml schema collection dbo.Book add
N'<xs:schema targetNamespace="http://tempuri.org/Books-v2"
  xmlns="http://tempuri.org/Books-v2"
  xmlns:xs="http://www.w3.org/2001/XMLSchema"  
  elementFormDefault="qualified">
  <xs:element type="xs:string" name="AuthorLastName"/>
</xs:schema>';
go
declare @Book1 xml(dbo.Book) =
N'<Books xmlns="http://tempuri.org/Books-v1">
  <AuthorFirstName>John</AuthorFirstName>
</Books>';
declare @Book2 xml(dbo.Book) =
N'<Books xmlns="http://tempuri.org/Books-v1" xmlns:v2="http://tempuri.org/Books-v2">
  <AuthorFirstName>John</AuthorFirstName>
  <v2:AuthorLastName>Smith</v2:AuthorLastName>
</Books>';
select @Book1;
select @Book2;
go
drop xml schema collection dbo.Book;
go
于 2019-09-12T13:18:55.917 回答