テーブルのインデックスを定義する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
に限定する方法がわかりません。
この関連付けを制限する方法はありますか?