0

生の XML を使用してアプリケーションによって実行されるアクションを表す監査/ログ システムがあります。アプリケーションの SQL Server データベース内のテーブルで XML 列を使用して、このシステムを大幅に改善したいと考えています。

テーブルの各行には 1 つのログ エントリが含まれ、各エントリには 1 つ以上のタグが含まれている必要があります。これらのタグは、アプリケーションの監査のニーズに一致する方法で検索できるように、セマンティックな方法でアクションを記述するために使用されます。例:

<updateInvoice id="5" userId="7" /><fieldUpdate name="InvoiceDate" /><invoice /><update />

<deleteInvoice id="5" userId="6" /><invoice /><delete />

私の意図は、タグと属性の組み合わせを指定して行を含めるか除外することにより、このテーブルから行セットを返すことです (たとえば、「タグですべての行を含めinvoice、属性で行を除外するuserId='7'」、または「タグですべての行を含め、行をinvoice除外する」タグ付きdelete

行を含めたり除外したりするタグと属性の組み合わせを表す単純なフィルター構造の組み合わせを使用して、プログラムでこれを行いたいと考えています。

私が使用する構造は次のようになります。

enum FilterInclusion { Include, Exclude };

public struct Filter
{
    FilterInclusion Inclusion;
    string TagName;
    string? AttributeName;
    object? AttributeValue;
}

私の目標は、これらのセットを受け入れ、単一の除外フィルターに一致することなく、単一の包含フィルターに一致するすべての行を返すクエリを生成することです。

このブール論理を結果の XPath 自体にエンコードする必要がありますか?それとも、出力されたクエリに複数の SELECT ステートメントを含めることを検討していますか? 私は XQuery を初めて使用しますが、助けていただければ幸いです。ありがとう!

4

1 に答える 1

1

それがあなたが探しているものであるかどうかはわかりませんが、XMLメソッドでノードをフィルタリングするには、角かっこ[と。を使用します]。たとえば、要素を選択しますが、のようなXPathを使用するfoo属性を持つ要素のみにフィルターをかけます。値5の属性を持つものが必要な場合は、を使用します。要素を持つ要素を選択する場合は、を使用します。bar/foo[@bar]@bar/foo[@bar=5]foobar/foo[bar]

declare @t table (x xml);
insert into @t (x) values 
(N'<foo bar="abc"/>');
insert into @t (x) values 
(N'<foo bar="5"/>');
insert into @t (x) values 
(N'<foo id="1"><bar id="2"/></foo>');
select * from @t;

select c.value(N'@bar', N'varchar(max)') 
from @t cross apply x.nodes(N'/foo[@bar]') t(c)

select c.value(N'@bar', N'varchar(max)') 
from @t cross apply x.nodes(N'/foo[@bar=5]') t(c)
select c.value(N'@id', N'int') 
from @t cross apply x.nodes(N'/foo[bar]') t(c)

私はあなたの投稿のXMLスニペットに例を示しようとしましたが、それらは構造がなく、有用な例を作成できません。

于 2009-08-29T04:48:52.697 に答える