1

SQL Server 2005では、以下のXMLを次の形式で詳細に解析しようとしていますが、それができません。助けに感謝します。選択した出力が次のようになります

1 TagSold Tag        0   101 2
2 TagReg  Customer   101 0   4
3 TagAdj  Tag        0   105 2



<TagDistributor>
<stbLedgerEntryTypes>
    <stbLedgerEntryType type="TagSold">
        <vcMapping>Tag</vcMapping>
        <tiCustTrxnTypeID>0</tiCustTrxnTypeID>
        <tiTagTrxnTypeID>101</tiTagTrxnTypeID>
        <tiPaymentTypeID>2</tiPaymentTypeID>
    </stbLedgerEntryType>
    <stbLedgerEntryType type="TagReg">
        <vcMapping>Customer</vcMapping>
        <tiCustTrxnTypeID>101</tiCustTrxnTypeID>
        <tiTagTrxnTypeID>0</tiTagTrxnTypeID>
        <tiPaymentTypeID>4</tiPaymentTypeID>
    </stbLedgerEntryType>
    <stbLedgerEntryType type="TagAdj">
        <vcMapping>Tag</vcMapping>
        <tiCustTrxnTypeID>0</tiCustTrxnTypeID>
        <tiTagTrxnTypeID>105</tiTagTrxnTypeID>
        <tiPaymentTypeID>2</tiPaymentTypeID>
    </stbLedgerEntryType>
</stbLedgerEntryTypes></TagDistributor>

以下を試してみました。出力を取得しました。しかし、最初の列では、区別するための属性値を取得していません。私は最初の行に疑問があります。

SELECT 
         a.b.query('.').value('@type', 'varchar(128)'),
         a.b.query('vcMapping').value('.', 'varchar(128)'),
         a.b.query('tiCustTrxnTypeID').value('.', 'int'),
         a.b.query('tiTagTrxnTypeID').value('.', 'int'),
         a.b.query('tiPaymentTypeID').value('.', 'int')
FROM    @ipv_xmlDistributorInfo.nodes('TagDistributor/stbLedgerEntryTypes/stbLedgerEntryType') a(b)
4

1 に答える 1

1

このようなものが動作するはずです:

SELECT 
   x.value('(@type)[1]', 'varchar(100)') AS 'Type',
   x.value('(vcMapping)[1]', 'varchar(100)') AS 'vcMapping',
   x.value('(tiCustTrxnTypeID)[1]', 'int') AS 'tiCustTrxnTypeID',
   x.value('(tiTagTrxnTypeID)[1]', 'int') AS 'tiTagTrxnTypeID',
   x.value('(tiPaymentTypeID)[1]', 'int') AS 'tiPaymentTypeID'
FROM XMLTable x
CROSS APPLY x.myXMLField.nodes('/TagDistributor/stbLedgerEntryTypes/stbLedgerEntryType') 
  n(x)

そして、ここにSQL Fiddleがあります。

幸運を。

于 2013-02-03T06:40:22.817 に答える