3

テーブルと、同じクエリからテーブルの XML 列の 1 つの内容をクエリしようとしています。

基本的に次のような私のテーブルスキーマ:

CREATE TABLE AuditLogs
(
    [AuditLogId] INT, 
    [ObjectType] VARCHAR(50), 
    [Action] VARCHAR(50), 
    [ObjectId] INT, 
    [Changes] XML
);

Changes次のような列の XML を使用します。

<ArrayOfChange>
    <Change FieldName="ItemStatus">
        <OldValue>Unreconciled</OldValue>
        <NewValue>Reconciled</NewValue>
    </Change>
    <Change FieldName="Amount">
        <OldValue>50.00</OldValue>
        <NewValue>45.00</NewValue>
    </Change>
</ArrayOfChange>

最後に、私が切望している結果は次のとおりです。

AuditLogId
Action
ObjectType
ObjectId
FieldName
OldValue
NewValue

真の StackOverflow の伝統では、私はこれを自分でいくつか試み、ある程度の進歩を遂げました。私が抱えている問題は、OldValue 列と NewValue 列が常に null であることです。

私の最新バージョンは次のとおりです。

SELECT
    [AuditLogId],
    [Action],
    [ObjectType],
    [ObjectId],
    c.n.value('@FieldName', 'varchar(50)') AS FieldName,
    c.n.value('(OldValue)[0]', 'varchar(50)') AS OldValue,
    c.n.value('(NewValue)[0]', 'varchar(50)') AS NewValue
FROM TMP
    CROSS APPLY [Changes].nodes('/ArrayOfChange/Change') c(n)

今、私は生活を楽にするためにSQLFiddleを作成しました。

4

1 に答える 1

2

あなたのxpathはあなたを失望させています。

変化する

c.n.value('(OldValue)[0]', 'varchar(50)') AS OldValue,
c.n.value('(NewValue)[0]', 'varchar(50)') AS NewValue

c.n.value('OldValue[1]', 'varchar(50)') AS OldValue,
c.n.value('NewValue[1]', 'varchar(50)') AS NewValue

Xpath は 1 ベースです (このブログ投稿では、このテーマについて多くの考察が行われています)。また、このような単純なパス式にはこれらの括弧は必要ありません (許可されていますが、ここでは不要です)。

于 2013-05-24T15:23:36.397 に答える