2016-09-12 1 views
0

テーブルのインデックスを定義するXML文書があります。
ここ例である:私は2行を取得する必要があるとき.nodes()を使用してxml文書をテーブルに細断する際に問題が発生する

<TargetDatabaseChanges> 
    <Tables> 
     <Table TName="Replacement" Schema="dbo" TextImageOnFileGroup="PRIMARY"> 
      <Indexes> 
       <Index IndexName="IX_InventoryId" PrimaryKeyIndex="0" IndexDescription="NONCLUSTERED" PadIndex="0" Statistics_NoRecompute="0" IgnoreDupKey="0" AllowRowLocks="1" AllowPageLocks="1"> 
        <IndexColumn ICName="ProductId" IsDescendingSort="0" OrdinalPosition="1" /> 
       </Index> 
       <Index IndexName="IX_VendorId" PrimaryKeyIndex="0" IndexDescription="NONCLUSTERED" PadIndex="0" Statistics_NoRecompute="0" IgnoreDupKey="0" AllowRowLocks="1" AllowPageLocks="1"> 
        <IndexColumn ICName="VendorId" IsDescendingSort="0" OrdinalPosition="1" /> 
       </Index> 
      </Indexes> 
     </Table> 
     <Table TName="Activity" Schema="dbo" TextImageOnFileGroup="PRIMARY"> 
      <Indexes> 
       <Index IndexName="IX_ApplicationId" PrimaryKeyIndex="0" IsUnique="0" IndexDescription="NONCLUSTERED" PadIndex="0" Statistics_NoRecompute="0" IgnoreDupKey="0" AllowRowLocks="1" AllowPageLocks="1"> 
        <IndexColumn ICName="ApplicationId" IsDescendingSort="0" OrdinalPosition="1" /> 
       </Index> 
      </Indexes> 
     </Table> 
    </Tables> 
</TargetDatabaseChanges> 

テーブルが各インデックスに関連付けられた別の列と2つのインデックスを有する、Iは、データの4行を得ます。

これは私のselect文です:

Replacement dbo IX_InventoryId 0 NULL NONCLUSTERED 0 0 0 1 1 ProductId 0 1 
Replacement dbo IX_InventoryId 0 NULL NONCLUSTERED 0 0 0 1 1 VendorId 0 1 
Replacement dbo IX_VendorId 0 NULL NONCLUSTERED 0 0 0 1 1 ProductId 0 1 
Replacement dbo IX_VendorId 0 NULL NONCLUSTERED 0 0 0 1 1 VendorId 0 1 

ベンダーIDが存在しないはずの列にインデックスをIX_InventoryId関連付け行:

SELECT DBTables.Name.value('@TName', 'varchar(100)') AS TableName, DBTables.Name.value('@Schema', 'varchar(20)') AS SchemaName, 
     [Indexes].I.value('@IndexName', 'varchar(100)') AS IndexName, [Indexes].I.value('@PrimaryKeyIndex', 'varchar(1)') AS PrimaryKeyIndex, [Indexes].I.value('@IsUnique', 'varchar(1)') AS IsUnique, 
      [Indexes].I.value('@IndexDescription', 'varchar(120)') AS IndexDescription, 
      [Indexes].I.value('@PadIndex', 'varchar(1)') AS PadIndex, [Indexes].I.value('@Statistics_NoRecompute', 'varchar(1)') AS StatisticsNoRecompute, [Indexes].I.value('@IgnoreDupKey', 'varchar(1)') AS IgnoreDupKey, 
      [Indexes].I.value('@AllowRowLocks', 'varchar(1)') AS AllowRowLocks, [Indexes].I.value('@AllowPageLocks', 'varchar(1)') AS AllowPageLocks, 
     [IndexColumn].IC.value('@ICName', 'varchar(100)') AS IndexColumnName, [IndexColumn].IC.value('@IsDescendingSort', 'varchar(1)') AS IsDescendingSort, 
     [IndexColumn].IC.value('@OrdinalPosition', 'varchar(2)') AS OrdinalPosition 
FROM @XmlDBChanges.nodes('/TargetDatabaseChanges/Tables/Table') AS DBTables(Name)    
     CROSS APPLY DBTables.Name.nodes('Indexes/Index[@PrimaryKeyIndex=0]') AS [Indexes](I) 
     CROSS APPLY DBTables.Name.nodes('Indexes/Index[@PrimaryKeyIndex=0]/IndexColumn') AS [IndexColumn](IC) 

これは2つのインデックスを持つテーブルのテーブルです。 ProductId列のIX_VendorId行と同じです。

CROSS APPLY DBTables.Name.nodes('Indexes/Index[@PrimaryKeyIndex=0]/IndexColumn') AS [IndexColumn](IC)はこの誤った関連付けを行っているようですが、正しいインデックスについてはIndexColumnに限定する方法がわかりません。

この関連付けを制限する方法はありますか?

答えて

0

はそれを考え出した...誰が助けを必要とする場合には... を私は最後CROSS APPLYを変更:これに

CROSS APPLY DBTables.Name.nodes('Indexes/Index[@PrimaryKeyIndex=0]/IndexColumn') AS [IndexColumn](IC) 

CROSS APPLY I.nodes('IndexColumn') AS [IndexColumn](IC) 

Iは以前からありますCROSS APPLY' So the FROM`句は次のようになります。

`FROM @XmlDBChanges.nodes('/TargetDatabaseChanges/Tables/Table') AS DBTables(Name)    
     CROSS APPLY DBTables.Name.nodes('Indexes/Index[@PrimaryKeyIndex=0]') AS [Indexes](I) 
     CROSS APPLY I.nodes('IndexColumn') AS [IndexColumn](IC)` 
0

cross applyには必要ありません。このようなクエリのすべてにアクセスできます。

select t.v.value('../../../@TName','varchar(100)') TName, 
t.v.value('../@IndexName','varchar(100)') IndexName, 
t.v.value('@ICName','varchar(100)') ICName 
from @x.nodes('TargetDatabaseChanges/Tables/Table/Indexes/Index/IndexColumn') t(v) 
--if you want to filter 
--from @x.nodes('TargetDatabaseChanges/Tables/Table/Indexes/Index[@PrimaryKeyIndex="0"]/IndexColumn') t(v) 
関連する問題