我有一个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'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节点的出现。 这可能吗?
答案 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'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