使用SQL查找具有字段值的节点的存在

时间:2016-09-09 05:50:16

标签: sql xml

我有一个SQL触发器,它从下面的XML文件中读取,并将值导入表单中的相关字段。

<?xml version="1.0" encoding="UTF-8"?>
<dataroot xmlns:od="urn:schemas-microsoft-com:officedata" generated="2016-08-18T07:03:22">
    <MPSExport>
        <ReportID>WR_2245</ReportID>
        <ActivityID>0</ActivityID>
        <Hours>13.75</Hours>
    </MPSExport>
    <MPSExport>
        <ReportID>WR_2245</ReportID>
        <ActivityID>115810</ActivityID>
        <Method>5</Method>
        <Herbicide_1>5</Herbicide_1>
        <Herbicide_Rate_1>0.05</Herbicide_Rate_1>
        <Herbicide_Qty_1>20</Herbicide_Qty_1>
        <Herbicide_2>2</Herbicide_2>
        <Herbicide_Rate_2>0.5</Herbicide_Rate_2>
        <Herbicide_Qty_2>60</Herbicide_Qty_2>
        <Herbicide_IsSurfactant_2>1</Herbicide_IsSurfactant_2>
        <Comments>Test.</Comments>
    </MPSExport>
    <MPSExport>
        <ReportID>WR_2245</ReportID>
        <ActivityID>115810</ActivityID>
        <Method>8</Method>
        <Herbicide_1>10</Herbicide_1>
        <Herbicide_Rate_1>2</Herbicide_Rate_1>
        <Herbicide_Qty_1>30</Herbicide_Qty_1>
        <Herbicide_2>2</Herbicide_2>
        <Herbicide_Rate_2>1</Herbicide_Rate_2>
        <Herbicide_Qty_2>70</Herbicide_Qty_2>
        <Herbicide_IsSurfactant_2>1</Herbicide_IsSurfactant_2>
        <Weed_1>5266</Weed_1>
        <Weed_2>5261</Weed_2>
        <Weed_3>5884</Weed_3>
        <Weed_4>4004</Weed_4>
        <Comments>WR_2245 finished off some of WMA_620&apos;s budget (MPS BLM Bal Est BC). Began treating rambling dock and winter cherry.</Comments>
        <FollowUpNotes>Continue to work through the Zone</FollowUpNotes>
    </MPSExport>
</dataroot>

由于重复使用相同名称的字段,它们对应于表单上不同选项卡中的字段。为了区分这些我使用

SELECT ROW_NUMBER() OVER (ORDER BY (SELECT 100)) AS ROW, 'Method', CAST([Method]AS VARCHAR(2)) FROM OPENXML(@hDoc, 'dataroot/MPSExport') WITH ([Method] [nvarchar](max) 'Method') WHERE [Method] IS NOT NULL
        UNION ALL.....continue with other fields

问题是,如果有人将XML文件中第一次出现的'Method'字段留空但第二次出现有值,我的导入过程将使用第二个Method值填充表单上的第一个Method字段。 XML文件。

有没有一种方法可以按父节点分组XML字段,即MPSExport?

作为对我试过的一个字段的测试

SELECT 'Method', CAST([Method]AS VARCHAR(2)),
ROW_NUMBER() OVER (ORDER BY T.X) AS ROW
FROM @XML.nodes('dataroot/MPSExport') AS T(X)
CROSS APPLY
OPENXML(@hDoc, 'dataroot/MPSExport') WITH ([Method] [nvarchar](max) 'Method')
WHERE [Method] IS NOT NULL

但它只是给了我以下

Method  5   1
Method  8   2
Method  5   3
Method  8   4
Method  5   5
Method  8   6

而我希望它显示

Method  5  2
Method  8  3

5和8是值,2和3是MPSExport节点的出现。 这可能吗?

1 个答案:

答案 0 :(得分:0)

首先:FROM OPENXML已过时,不应再使用了。

更好地使用最新的 XML方法,例如.value().nodes().modify().query()

使用CROSS APPLY的代码会生成每个连接,因此会产生多行结果。

您的问题是编号所有方法,但只显示带有值的行。

我的方法:使用.nodes()获取所有<MSPExport> - 元素,并将它们编号为是否有<Method>。然后取这个派生表并过滤非空的方法。

如果一个<Method>下面有多个<MSPExport>,则可能会出现问题...

DECLARE @xml XML=
N'<dataroot xmlns:od="urn:schemas-microsoft-com:officedata" generated="2016-08-18T07:03:22">
    <MPSExport>
        <ReportID>WR_2245</ReportID>
        <ActivityID>0</ActivityID>
        <Hours>13.75</Hours>
    </MPSExport>
    <MPSExport>
        <ReportID>WR_2245</ReportID>
        <ActivityID>115810</ActivityID>
        <Method>5</Method>
        <Herbicide_1>5</Herbicide_1>
        <Herbicide_Rate_1>0.05</Herbicide_Rate_1>
        <Herbicide_Qty_1>20</Herbicide_Qty_1>
        <Herbicide_2>2</Herbicide_2>
        <Herbicide_Rate_2>0.5</Herbicide_Rate_2>
        <Herbicide_Qty_2>60</Herbicide_Qty_2>
        <Herbicide_IsSurfactant_2>1</Herbicide_IsSurfactant_2>
        <Comments>Test.</Comments>
    </MPSExport>
    <MPSExport>
        <ReportID>WR_2245</ReportID>
        <ActivityID>115810</ActivityID>
        <Method>8</Method>
        <Herbicide_1>10</Herbicide_1>
        <Herbicide_Rate_1>2</Herbicide_Rate_1>
        <Herbicide_Qty_1>30</Herbicide_Qty_1>
        <Herbicide_2>2</Herbicide_2>
        <Herbicide_Rate_2>1</Herbicide_Rate_2>
        <Herbicide_Qty_2>70</Herbicide_Qty_2>
        <Herbicide_IsSurfactant_2>1</Herbicide_IsSurfactant_2>
        <Weed_1>5266</Weed_1>
        <Weed_2>5261</Weed_2>
        <Weed_3>5884</Weed_3>
        <Weed_4>4004</Weed_4>
        <Comments>WR_2245 finished off some of WMA_620&apos;s budget (MPS BLM Bal Est BC). Began treating rambling dock and winter cherry.</Comments>
        <FollowUpNotes>Continue to work through the Zone</FollowUpNotes>
    </MPSExport>
</dataroot>';

- 这是查询

WITH NumberdMethods AS
(
    SELECT ROW_NUMBER() OVER(ORDER BY (SELECT NULL)) AS [ROW]
          ,ex.value('Method[1]','int') AS Method
    FROM @xml.nodes('/dataroot/MPSExport') AS A(ex)
)
SELECT * 
FROM NumberdMethods
WHERE Method IS NOT NULL

结果

ROW Method
2   5
3   8