Aracılığıyla paylaş


Derinlik, sql:max kullanarak yinelenen ilişkiler belirtme-derinliği

Ilişkisel veritabanlarındaki, tıklattığınızda bir tablo ilgili kendisiyle bir ilişkide, özyinelemeli bir ilişki denir.Örneğin, gözetmen supervisee ilişkisinde, kendisiyle ilişki içinde çalışan kayıtları saklamak için bir tablo katıldı.Bu durumda, çalışanları tablo ilişki ve aynı tarafta bir yönetici rolünün oynadığı tablo diğer taraftan supervisee bir rolü oynar.

Şema eşleme aynı türde bir öğe ile üst nerede olduğunu özyinelemeli ilişkileri içerebilir.

Örnek A

Aşağıdaki noktaları göz önünde bulundurun tablo:

Emp (EmployeeID, FirstName, LastName, ReportsTo)

Bu tabloda, raporlar sütun yöneticisinin çalışan NUMARASıNı depolar.

Çalışan Yöneticisi çalışan hiyerarşisinin en üstünde olduğu bir XML hiyerarşisi oluşturmak istediğinizi varsayalım ve çalışanları, yönetici bu rapora görünme ilgili hiyerarşisinde aşağıdaki örnek XML parçası gösterildiği gibi.Ne bu parça gösteren özyinelemeli ağaçÇalışan 1.

<?xml version="1.0" encoding="utf-8" ?> 
<root>
  <Emp FirstName="Nancy" EmployeeID="1" LastName="Devolio">
     <Emp FirstName="Andrew" EmployeeID="2" LastName="Fuller" /> 
     <Emp FirstName="Janet" EmployeeID="3" LastName="Leverling">
        <Emp FirstName="Margaret" EmployeeID="4" LastName="Peacock">
          <Emp FirstName="Steven" EmployeeID="5" LastName="Devolio">
...
...
</root>

Bu parçasındaki Çalışan 5, çalışana 4, 4 çalışan Çalışan 3 ve Çalışan 1'için 3 ve 2 çalışanları raporlarını raporların bildirir.

Bu sonucu üretmek için , aşağıdaki XSD Şeması'nı kullanın ve bir XPath sorgusu da belirtin.Şema açıklar bir **<EMP>**Tür oluşan EmployeeType, öğe bir <EMP> aynı türden, EmployeeType alt öğesi. (Aynı türde öğe ve, üst olan) bir özyinelemeli ilişkidir.In addition, the schema uses a <sql:relationship> to describe the parent-child relationship between the supervisor and supervisee.Bu Not **<SQL:Relationship>**Hem üst hem de alt tablo EMP var.

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
            xmlns:dt="urn:schemas-microsoft-com:datatypes"
            xmlns:sql="urn:schemas-microsoft-com:mapping-schema">
  <xsd:annotation>
    <xsd:appinfo>
      <sql:relationship name="SupervisorSupervisee"
                                  parent="Emp"
                                  parent-key="EmployeeID"
                                  child="Emp"
                                  child-key="ReportsTo" />
    </xsd:appinfo>
  </xsd:annotation>
  <xsd:element name="Emp" type="EmployeeType" 
                          sql:relation="Emp" 
                          sql:key-fields="EmployeeID" 
                          sql:limit-field="ReportsTo" />
  <xsd:complexType name="EmployeeType">
    <xsd:sequence>
      <xsd:element name="Emp" type="EmployeeType" 
                              sql:relation="Emp" 
                              sql:key-fields="EmployeeID"
                              sql:relationship="SupervisorSupervisee"
                              sql:max-depth="6" />
    </xsd:sequence> 
    <xsd:attribute name="EmployeeID" type="xsd:ID" />
    <xsd:attribute name="FirstName" type="xsd:string"/>
    <xsd:attribute name="LastName" type="xsd:string"/>
  </xsd:complexType>
</xsd:schema>

Ilişki özyinelemeli olduğundan, şemada özyineleme derinliğini belirlemek için birkaç yol gerekir.Aksi halde sonuç bir sonsuz özyinelemeye (çalışanın çalışan vb. için) bildirdiği için çalışan) olacaktır.The sql:max-depth annotation allows you to specify how deep in the recursion to go.Bir değer belirtmek için bu belirli örnekte sql:max-depth, nasıl derin yönetimi hiyerarşi şirkette gider bilmelisiniz.

Not

Şema belirtir sql:limit-field Ek açıklamayı değil belirtiyor, ancak sql:limit-value Ek açıklama. Bu, yalnızca herkese bildirmeyen çalışanları için elde edilen hiyerarşideki üst düğüm sınırlar.(Raporlar, NULL olur.) Belirtmesql:limit-field ve değil sql:limit-value (Varsayılan olarak hangi NULL olarak ayarlanır) açıklama bunu gerçekleştirir. Sonuç isterseniz, her olası bildirdiği eklemek için XML ağacı (raporlama ağaç her çalışan için tablo), kaldırma sql:limit-field Ek açıklama şemada.

Not

Aşağıdaki yordam tempdb veritabanını kullanır.

Şemaya örnek bir XPath sorgusu sınamak için

  1. Tempdb veritabanı için sanal kök işaret EMP adlı örnek tablo oluşturun.

    USE tempdb
    CREATE TABLE Emp (
           EmployeeID int primary key, 
           FirstName  varchar(20), 
           LastName   varchar(20), 
           ReportsTo int)
    
  2. Bu örnek verileri ekleyin:

    INSERT INTO Emp values (1, 'Nancy', 'Devolio',NULL)
    INSERT INTO Emp values (2, 'Andrew', 'Fuller',1)
    INSERT INTO Emp values (3, 'Janet', 'Leverling',1)
    INSERT INTO Emp values (4, 'Margaret', 'Peacock',3)
    INSERT INTO Emp values (5, 'Steven', 'Devolio',4)
    INSERT INTO Emp values (6, 'Nancy', 'Buchanan',5)
    INSERT INTO Emp values (7, 'Michael', 'Suyama',6)
    
  3. Yukarıdaki şema kodunu kopyalayıp, bir metin dosyasına yapıştırın.Dosyayı maxDepth.xml kaydedin.

  4. Şu şablonu kopyalayıp, bir metin dosyasına yapıştırın.Dosyayı maxDepthT.xml maxDepth.xml kaydettiğiniz aynı dizine kaydedin.Şablon sorgudaki tüm çalışanları EMP tablosunda döndürür.

    <ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql">
      <sql:xpath-query mapping-schema="maxDepth.xml">
        /Emp
      </sql:xpath-query>
    </ROOT>
    

    Eşleştirme şemasını (maxDepth.xml) dizini belirtilen şablon kaydedildiği göreli dizinidir.Mutlak bir yol da, örneğin belirtilebilir:

    mapping-schema="C:\MyDir\maxDepth.xml"
    
  5. Oluşturun ve SQLXML 4.0 sınama komut dosyası (Sqlxml4test.vbs) şablonu yürütmek için kullanın.Daha fazla bilgi için bkz:ADO SQLXML yürütmek kullanarak 4.0 sorgular..

Bu sonucu oluşur:

<?xml version="1.0" encoding="utf-8" ?> 
<root>
  <Emp FirstName="Nancy" EmployeeID="1" LastName="Devolio">
  <Emp FirstName="Andrew" EmployeeID="2" LastName="Fuller" /> 
    <Emp FirstName="Janet" EmployeeID="3" LastName="Leverling">
      <Emp FirstName="Margaret" EmployeeID="4" LastName="Peacock">
        <Emp FirstName="Steven" EmployeeID="5" LastName="Devolio">
          <Emp FirstName="Nancy" EmployeeID="6" LastName="Buchanan">
            <Emp FirstName="Michael" EmployeeID="7" LastName="Suyama" /> 
          </Emp>
        </Emp>
      </Emp>
    </Emp>
  </Emp>
</root>

Not

Farklı derinliğinden, sonuç hiyerarşileri oluşturmak için , değerini değiştirin: sql:max-depth Ek açıklama şemasındaki ve şablon her değişiklikten sonra yeniden çalıştırın.

Önceki şemadaki tüm <EMP> öğeleri, öznitelikleri () ile aynı kümesini karşılaştıÇalışanNo, Ad, and Soyadı).Aşağıdaki şema biraz ek dönmek için değiştirildi. Raporlar tüm özniteliği**<EMP>** öğeleri bir yöneticisine bildirin.

Örneğin, bu XML parçası çalışanın 1 düzeyindekilerin gösterir:

<?xml version="1.0" encoding="utf-8" ?> 
<root>
<Emp FirstName="Nancy" EmployeeID="1" LastName="Devolio">
  <Emp FirstName="Andrew" EmployeeID="2" 
       ReportsTo="1" LastName="Fuller" /> 
  <Emp FirstName="Janet" EmployeeID="3" 
       ReportsTo="1" LastName="Leverling">
...
...

Bu, gözden geçirilmiş şema oluşur:

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
            xmlns:dt="urn:schemas-microsoft-com:datatypes"
            xmlns:sql="urn:schemas-microsoft-com:mapping-schema">
  <xsd:annotation>
    <xsd:documentation>
      Customer-Order-Order Details Schema
      Copyright 2000 Microsoft. All rights reserved.
    </xsd:documentation>
    <xsd:appinfo>
      <sql:relationship name="SupervisorSupervisee" 
                  parent="Emp"
                  parent-key="EmployeeID"
                  child="Emp"
                  child-key="ReportsTo" />
    </xsd:appinfo>
  </xsd:annotation>
  <xsd:element name="Emp" 
                   type="EmpType" 
                   sql:relation="Emp" 
                   sql:key-fields="EmployeeID" 
                   sql:limit-field="ReportsTo" />
  <xsd:complexType name="EmpType">
    <xsd:sequence>
       <xsd:element name="Emp" 
                    type="EmpType" 
                    sql:relation="Emp" 
                    sql:key-fields="EmployeeID"
                    sql:relationship="SupervisorSupervisee"
                    sql:max-depth="6"/>
    </xsd:sequence> 
    <xsd:attribute name="EmployeeID" type="xsd:int" />
    <xsd:attribute name="FirstName" type="xsd:string"/>
    <xsd:attribute name="LastName" type="xsd:string"/>
    <xsd:attribute name="ReportsTo" type="xsd:int" />
  </xsd:complexType>
</xsd:schema>

SQL:Max-derinlik ek açıklaması

Özyinelemeli ilişkilerini oluşan şemada özyineleme derinliğini şemada açıkça belirtilmelidir.Bu, başarıyla istenen sonuçlar döndürüyor ilgili IÇIN XML AÇıK sorgu oluşturmak için gereklidir.

Use sql:max-depth Ek açıklama şemadaki şemada tanımlanan özyinelemeli ilişkisinde özyineleme derinliğini belirtin. Değeri sql:max-depth Ek açıklama recursions sayısını belirten pozitif bir tamsayı (1-50) verilmiştir: 1 Değeri, öğede özyineleme vermiyor sql:max-depth Açıklama belirtilen; 2 değeri, öğeye'den sonraki düzeyinde özyineleme durdurur. sql:max-depth belirtilmedi; ve böyle devam eder.

Not

Temel uygulamasında, bir SELECT için bir eşleme şeması karşı belirtilen XPath sorgusu dönüştürülür...XML AÇıK bir sorgu IÇIN.Bu sorgu, sonlu bir özyineleme derinliğini belirtin gerektirir.Belirlediğiniz daha yüksek değer sql:max-depth, oluşturulan büyük IÇIN XML AÇıK sorgu. Bu işlem, alma saat yavaşlatabilir.

Not

Ek açıklamayı en çok derinlik, Updategrams ve XML toplu yükleme yoksayın.Bu, özyinelemeli bir güncelleştirme veya ekleme, ne, değer ne olursa olsun olacağını gösterir için en fazla derinliği belirtin.

SQL:Max belirtme-karmaşık öğeler üzerinde derinliği

The sql:max-depth annotation can be specified on any complex content element.

Yinelenen öðeler

If sql:max-depth üst öğe, hem de alt öğe özyinelemeli ilişkisinde, belirtilen sql:max-depth Ek açıklama üst üzerinde belirtilen öncelik kazanır. Örneğin, aşağıdaki şema sql:max-depth üst ve alt çalışan öğeleri ek açıklama belirtildi. Bu durumda, sql:max-depth=4, üzerinde belirtilen <EMP> (bir yönetici rolünün yürütme), üst öğenin öncelik kazanır. The sql:max-depth specified on the alt <Emp> element (playing a role of supervisee) is ignored.

Örnek: B

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
            xmlns:dt="urn:schemas-microsoft-com:datatypes"
            xmlns:sql="urn:schemas-microsoft-com:mapping-schema">
  <xsd:annotation>
    <xsd:appinfo>
      <sql:relationship name="SupervisorSupervisee"
                                  parent="Emp"
                                  parent-key="EmployeeID"
                                  child="Emp"
                                  child-key="ReportsTo" />
    </xsd:appinfo>
  </xsd:annotation>
  <xsd:element name="Emp" type="EmployeeType" 
                          sql:relation="Emp" 
                          sql:key-fields="EmployeeID" 
                          sql:limit-field="ReportsTo" 
                          sql:max-depth="3" />
  <xsd:complexType name="EmployeeType">
    <xsd:sequence>
      <xsd:element name="Emp" type="EmployeeType" 
                              sql:relation="Emp" 
                              sql:key-fields="EmployeeID"
                              sql:relationship="SupervisorSupervisee"
                              sql:max-depth="2" />
    </xsd:sequence> 
    <xsd:attribute name="EmployeeID" type="xsd:ID" />
    <xsd:attribute name="FirstName" type="xsd:string"/>
    <xsd:attribute name="LastName" type="xsd:string"/>
  </xsd:complexType>
</xsd:schema>

Bu şema sınamak için , örnek a (Bu konuda daha önce verilen adımları izleyin.

Yinelenmeyen öğeleri

If the sql:max-depth annotation is specified on an element in the schema that does not cause any recursion, it is ignored.Aşağıdaki şemada bir <EMP> öğe oluşan bir <Sabit> hangi sırayla olan alt öğe bir <EMP> alt öğe.

Bu şemadaki sql:max-depth Açıklama belirtilen <Sabit> öğe Yinelemesiz arasında olduğundan yoksayıldı <EMP> üst ve <Sabit> alt öğe. Özyineleme arasında ancak <EMP> üst ve <EMP> alt. Şema belirtir sql:max-depth Ek açıklamayı her ikisi de. Bu nedenle, sql:max-depth üst (üzerinde belirtilen ek açıklama**<EMP>** yönetici rolünde) öncelik kazanır.

Örneğin, C

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
xmlns:sql="urn:schemas-microsoft-com:mapping-schema">
  <xsd:annotation>
    <xsd:appinfo>
      <sql:relationship name="SupervisorSupervisee" 
                  parent="Emp" 
                  child="Emp" 
                  parent-key="EmployeeID" 
                  child-key="ReportsTo"/>
    </xsd:appinfo>
  </xsd:annotation>
  <xsd:element name="Emp" 
               sql:relation="Emp" 
               type="EmpType"
               sql:limit-field="ReportsTo"
               sql:max-depth="1" />
    <xsd:complexType name="EmpType" >
      <xsd:sequence>
       <xsd:element name="Constant" 
                    sql:is-constant="1" 
                    sql:max-depth="20" >
         <xsd:complexType >
           <xsd:sequence>
            <xsd:element name="Emp" 
                         sql:relation="Emp" type="EmpType"
                         sql:relationship="SupervisorSupervisee" 
                         sql:max-depth="3" />
         </xsd:sequence>
         </xsd:complexType>
         </xsd:element>
      </xsd:sequence>
      <xsd:attribute name="EmployeeID" type="xsd:int" />
    </xsd:complexType>
</xsd:schema>

Bu şema sınamak için , bu konuda BIR örnek için verilen adımları izleyin.

Kısıtlama derived karmaşık türleri

Tarafından bir karmaşık türü türetme varsa <kısıtlama>, karşılık gelen temel karmaşık türün öğeleri belirleyemezsiniz sql:max-depth Ek açıklama. Bu durumda, sql:max-depth Ek açıklama, türetilen türde öğesine eklenebilir.

Tarafından bir karmaşık türü türetme varsa, diğer yandan üzerinde <Uzantı>, karşılık gelen temel karmaşık türün öğeleri belirtebilirsiniz sql:max-depth Ek açıklama.

Örneğin, aşağıdaki XSD şeması için bir hata üretir sql:max-depth Ek açıklama üzerinde temel türü belirtildi. Bu eklenti tarafından türetilmiş bir tür desteklenmiyor <kısıtlama> başka bir türden. Bu sorunu gidermek için , şema değiştirme ve gerekir belirtmek sql:max-depth Ek açıklamayı türetilen türde bir öğe.

Örnek: B

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
            xmlns:dt="urn:schemas-microsoft-com:datatypes"
            xmlns:msdata="urn:schemas-microsoft-com:mapping-schema">
  <xsd:complexType name="CustomerBaseType"> 
    <xsd:sequence>
       <xsd:element name="CID" msdata:field="CustomerID" />
       <xsd:element name="CompanyName"/>
       <xsd:element name="Customers" msdata:max-depth="3">
         <xsd:annotation>
           <xsd:appinfo>
             <msdata:relationship
                     parent="Customers"
                     parent-key="CustomerID"
                     child-key="CustomerID"
                     child="Customers" />
           </xsd:appinfo>
         </xsd:annotation>
       </xsd:element>
    </xsd:sequence>
  </xsd:complexType>
  <xsd:element name="Customers" type="CustomerType"/>
  <xsd:complexType name="CustomerType">
    <xsd:complexContent>
       <xsd:restriction base="CustomerBaseType">
          <xsd:sequence>
            <xsd:element name="CID" 
                         type="xsd:string"/>
            <xsd:element name="CompanyName" 
                         type="xsd:string"
                         msdata:field="CName" />
            <xsd:element name="Customers" 
                         type="CustomerType" />
          </xsd:sequence>
       </xsd:restriction>
    </xsd:complexContent>
  </xsd:complexType>
</xsd:schema> 

Şemada, sql:max-depth üzerinde belirtilen bir CustomerBaseType karmaşık tür. Ayrıca, şema belirtir bir <Müşteri> öğe türü CustomerType, den türetilen CustomerBaseType. XPath sorgusu, bir tür şemada belirtilen hata nedeniyle oluşturur sql:max-depth kısıtlama temel tür tanımlanmış bir öğe üzerinde desteklenmiyor.

Derin bir hiyerarşi şemalarla

Sırayla başka bir alt öğe içeren bir alt öğe içinde bir öğe içeriyor, derin bir hiyerarşi içeren bir şemayı sahip ve böyle devam eder.If the sql:max-depth annotation specified in such a schema generates an XML document that includes a hierarchy of more than 500 levels (with top-düzey element at düzey 1, its alt at düzey 2, and so on), an error is returned.